PerfView专题 (第九篇):洞察 C# 中的 LOH 内存碎片化

一:背景

内存泄漏 的系列问题中,有一类问题是 内存碎片化 导致的,而且这种更容易发生在 LOH 上,因为它默认不开启 对象压缩,一般遇到这种情况,优先让朋友执行下面的代码应急。

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();

后续再研究问题根源,这篇我们就来聊一聊如何用 PerfView 神器帮助我们寻找 内存碎片化 的根源。

二:碎片化洞察

1. WinDbg 的局限

为了方便讲述,先上一段造成 LOH内存碎片化 的测试代码。

internal class Program{static void Main(string[] args){Test();Console.ReadLine();}public static List<byte[]> list = new List<byte[]>();static void Test(){for (int i = 0; i < 50000; i++){if (i % 2 == 0){list.Add(new byte[85000 * 2]);list[i] = null;}else{list.Add(new byte[85000]);}}Console.WriteLine("5w 数据插入完毕!");}}

代码逻辑非常简单,就是间隔释放其中的 byte[] 对象,让 Free 和 Live 对象成交错状, 可以用 WinDbg 观察如下:

0:009> !dumpheap Address               MT     Size
...
00000000f0cd6028 000000000050ff60   170088 Free
00000000f0cff890 00007ffdb4a25490    85024     
00000000f0d144b0 000000000050ff60   170088 Free
00000000f0d3dd18 00007ffdb4a25490    85024     
00000000f0d52938 000000000050ff60   170088 Free
00000000f0d7c1a0 00007ffdb4a25490    85024     
00000000f0d90dc0 000000000050ff60   170088 Free
00000000f0dba628 00007ffdb4a25490    85024     
00000000f0dcf248 000000000050ff60   170088 Free
00000000f0df8ab0 00007ffdb4a25490    85024     
00000000f0e0d6d0 000000000050ff60   170088 Free
00000000f0e36f38 00007ffdb4a25490    85024     
00000000f0e4bb58 000000000050ff60   170088 Free
00000000f0e753c0 00007ffdb4a25490    85024     
00000000f0e89fe0 000000000050ff60   170088 Free
00000000f0eb3848 00007ffdb4a25490    85024     
00000000f0ec8468 000000000050ff60   170088 Free
00000000f0ef1cd0 00007ffdb4a25490    85024     
00000000f0f068f0 000000000050ff60   170088 Free
00000000f0f30158 00007ffdb4a25490    85024     
00000000f0f44d78 000000000050ff60   170088 Free
...

虽然用 WinDBG 可以轻松找出,但这里有一个非常大的局限,就是你不知道 Free 对象生前是什么东西,往往这时候就只能用 db,dc,du 看内存地址,在无计可施的情况下, PerfView 就可以大显威龙了。

2. PerfView 洞察

接下来我们打开PerfView,采用默认设置启动收集,稍等之后,点击 Memory -> GCStats 项,观察 LOH Frag % 列,如下图所示:

8c353ba6e62712577a43129e868e6deb.png

从图中的 LOH Frag % 列可以看出碎片化确实蛮高的,接下来我们就是找 Free 块生前是什么东西,如果能记录到 Free 生成是由谁分配的那该有多好呀!!!

哈哈,在 PerfView 中还真有这么一个视图叫 Gen 2 Object Deaths Stacks,如下图所示:

655a281590c51b8d27f4136f15927831.png

从名字上就能看到,这个视图记录的是 LOH 上那些已经死亡对象的生前 Stack,当然了,这是按权重计算的,如果是 Event 模式产生的就好了,那会记录所有的对象分配。

接下来双击 Gen 2 Object Deaths Stacks 再选中我们的应用程序,可以看到权重占比最高的是 System.Byte[] 对象,如下图所示:

432b725331efc0a61dcf6a5dd9948e05.png

接下来右键点击 Goto -> Goto Item in Callers 按钮,可以看到占比最高的是 Program.Test() 分配所致,高达 9396 个,如下图所示:

7c9489cc758985172bd31e975796c9c3.png

接下来就是调研 Program.Test() 方法,找出最后被 Free 的原因, 这就是 PerfView 和 WinDbg 双剑合璧的威力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HSV色彩空间

转自原文 HSV色彩空间 理解HSV色彩空间&#xff1a; HSV颜色模式是除了RGB颜色模式之外的另一种流行的颜色模式&#xff0c;RGB被广泛运用于计算机中&#xff0c;而HSV则用在电视显示方面。它更符合人们对颜色的描述(什么颜色(H)&#xff0c;深浅度如何(S)&#xff0c;亮度如…

java随机抽题系统_为什么要使用考试系统的随机组卷功能?

一个考试系统的组卷灵活性&#xff0c;不仅仅在于其题型丰富、设置参数齐全&#xff0c;也在于抽题组卷方式。除了平时我们严肃性的固定题目出卷方式&#xff0c;我们往往也考虑到需要随机组卷的功能。为什么用户会需要随机组卷的功能呢&#xff1f;随机组卷功能有什么用处&…

frameset在html5下用什么代替_速速围观!冬至吃货地图来啦~蚌埠的吃货们,你们今天吃什么?...

中国传统二十四节日冬农历十一月初七至冬至&#xff0c;又称日短至、冬节、亚岁等&#xff0c;兼具自然与人文两大内涵&#xff0c;既是二十四节气中一个重要的节气&#xff0c;也是中国民间的传统节日&#xff0c;被视为冬季的大节日。我们迎来了冬至节气&#xff0c;真正的隆…

QuillEditor 图片添加缩放功能

安装插件 npm install --save quill-blot-formatter 使用&#xff1a; 添加 :modules"modules" <template><QuillEditorref"refEditor"theme"snow":toolbar"toolbarOptions"contentType"html"enable:content…

Servlet 应用程序事件、监听器

Web容器管理Servlet/JSP相关的生命周期&#xff0c;若对HttpServletRequest对象、HttpSession对象、ServletContxt对象在生成、销毁或相关属性设置发生的时机点有兴趣&#xff0c;可以实现对应的监听器(Listener)。 一、ServletContext事件、监听器 与ServletContext相关的监听…

巴川数据科学炼成记_智橡树智能英语好不好有哪些功能?提出的科学学习思想是什么?...

智橡树智能英语与真人老师英语教学的最大区别就是解决老师课堂上不擅长、学生课后难坚持的单词、听力、口语、阅读重复训练问题&#xff0c;是辅助老师课堂教学的最佳搭档&#xff01;智橡树智能英语基于人工智能及大数据技术&#xff0c;专注音标、单词、听力、阅读、语法、口…

vite解决警告: You are running the esm-bundler build of vue-i18n. It is recomme

(转载请删除括号里的内容) 解决方法&#xff1a;在vite.config.js加入以下代码 resolve: { alias: {vue-i18n: vue-i18n/dist/vue-i18n.cjs.js} }--------------------- 作者&#xff1a;BY_BC 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/BY_BC/article…

设计师要懂布局(一)

2019独角兽企业重金招聘Python工程师标准>>> 页面版式的好坏给了用户第一印象&#xff0c;好不好用&#xff0c;想不想看页面的内容&#xff0c;要不要收藏这个页面&#xff0c;在设计中都起到了决定性作用。 在互联网时代&#xff0c;我们接触最多的就是手机和电脑…

ES6入门之Symbol

ES5对象属性名都是字符串容易造成属性名的冲突。 eg:var a { name: lucy};a.name lili;这样就会重写属性 ES6引入了一种新的原始数据类型Symbol&#xff0c;表示独一无二的值。 重新复习下新知识&#xff1a;基本数据类型有6种&#xff1a;Undefined、Null、布尔值&#xff0…

mac safari无法连接服务器_宇航员乘坐SpaceX飞船返航中iPad上Safari出现“无法连接到网络”错误...

罗伯特贝恩肯(Robert Behnken)和道格拉斯赫尔利(Douglas Hurley)在完成轨道实验室任务后&#xff0c;于今天搭乘 SpaceX 公司的"Crew Dragon"飞船离开国际空间站&#xff0c;为他们历史性的国际空间站飞行画上句号。两名宇航员在位于美国德克萨斯州休斯顿和加利福尼亚…

Vue 大量数据展示卡顿解决方案(长列表优化)

需求分析&#xff08;长列表展示&#xff09; 页面某处需要渲染 1w 条数据&#xff0c;并需要滚动展示&#xff0c;这时如果直接把这些数据渲染到页面上&#xff0c;会导致系统内存大量被占用&#xff0c;导致页面卡顿或崩溃 我们都知道&#xff0c;每次 DOM 修改&#xff0c;浏…

Django-admin管理工具

admin组件使用 Django 提供了基于 web 的管理工具。 Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它&#xff1a; # Application definitionINSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contr…

[转]mysql的sql优化工具

原标题&#xff1a;DBA的五款最佳SQL查询优化工具&#xff0c;收藏了 一般来说&#xff0c;SQL查询优化器分析给定查询的许多选项&#xff0c;预估每个选项的成本&#xff0c;最后选择成本最低的选项。如果查询优化器选择了错误的计划&#xff0c;则性能差异可能从几毫秒到几分…

.NET 7 中的 HttpResult 接口

.NET 7 中的 HttpResult 接口Intro在前面的文章中&#xff0c;我们提到了 .NET 7 引入了 Endpoint Filter 来支持 Endpoint 的过滤器&#xff0c;有了这个接口就想着把之前的统一 API response 的 filter 改造一下支持 endpoint filter&#xff0c;然而这个一直等到了 .NET 7 P…

5、Hive的自定义UDF函数

2019独角兽企业重金招聘Python工程师标准>>> 1、pom.xml引入依赖及打包 <dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.1.0</version></depende…

多线程-单生产单消费模型

2019独角兽企业重金招聘Python工程师标准>>> 创建资源对象&#xff0c;提供保存和取出方法&#xff08;使用synchronized代码块实现&#xff09; /*** Created by shaoqinghua on 2018/5/3.* 定义一个负责保存和取出的资源类*/ public class Resource {/*** 定义成员…

github1s 油猴插件

github1s 是一个非常有趣的项目&#xff0c;它可以让你在 1 秒内&#xff08;俗称 1s&#xff09;通过在线版本的 VS Code 来打开 GitHub 上的代码&#xff0c;只需要在对应项目的 URL 后面加上 1s 即可。 这是一个很有创意、很赞的项目&#xff0c;只需要在对应的 GitHub 项目…

WPF-02 布局

WPF中布局控件继承Panel&#xff0c;可以实现非常复杂的布局。我们介绍一下常用的布局控件1. Grid 布局控件Grid是网格布局控件&#xff0c;在WPF开发中我们用的最多的一个布局控件&#xff0c;可以自定义行和列&#xff0c;分别设置Height和Witdh值&#xff0c;一般推荐通过比…

微信多开工具 可以同时在电脑上打开多个微信 免费开源

本程序用C#代码编写&#xff0c;运行环境FrameWork5.0以上。 主要代码&#xff1a; using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using Sys…

Linux 第十周学习笔记(2)smtp服务的部署

SMTP服务的部署介绍&#xff1a;SMTP(Simple Mail Transfer Protocol)简单邮件传输协议是一种提供可靠且有效电子邮件传输的协议。 SMTP 是建模在 FTP 文件传输服务上的一种邮件服务&#xff0c;主要用于传输系统之间的邮件信息并提供来信有关的通知。一&#xff0e;环境的部署…