PerfView专题 (第二篇):如何寻找 C# 中的 Heap堆内存泄漏
一:背景
上一篇我们聊到了如何去找 热点函数,这一篇我们来看下当你的程序出现了 非托管内存泄漏 时如何去寻找可疑的代码源头,其实思路很简单,就是在 HeapAlloc 或者 VirtualAlloc 时做 Hook 拦截,记录它的调用栈以及分配的内存量, PerfView 会将这个 分配量 做成一个 权重,最后可以根据 权重 高低来找到有问题的调用栈。
二:案例演示
为了方便讲述,我们演示一个 Windows 的 Nt堆 内存泄漏,让 C# 调用 C++ 代码时故意泄漏内存,代码如下:
#include <iostream>
extern "C"
{
_declspec(dllexport) int calc_size(int size);
}
int calc_size(int size) {
int* buffer = new int[size];
return 2 * size;
}
然后在 C# 中导入这个 C++ 的 dll。
internal class Program
{
[DllImport("ConsoleApplication2.dll", CallingConvention = CallingConvention.Cdecl)]
extern static int calc_size(int size);
static void Main(string[] args)
{
for (int i = 0; i < int.MaxValue; i++)
{
var size = calc_size(1000);
Console.WriteLine($"i={i}");
}
}
}
接下来把程序跑起来,再打开 Perfview,在 OS Heap Process 输入框填入进程号19404,监控 15s然后 Start Collection即可,这么做的目的时拦截 HeapAlloc 和 HeapFree 方法,截图如下:
稍等 15s 之后,打开 Memory / Net OS Heap Alloc Stacks 选项卡。
接下来切到 CallTree 选项卡,清除掉 GroupPats 中的条件,观察各自的调用栈,截图如下:
从图中的 inc % 列可以看到,calc_size 方法的 分配权重量 占 总分配量的 99.9% ,这就说明此方法有很大的嫌疑,最后就是查看源码了哦。
PerfView专题 (第二篇):如何寻找 C# 中的 Heap堆内存泄漏的更多相关文章
- PerfView专题 (第九篇):洞察 C# 中的 LOH 内存碎片化
一:背景 在 内存泄漏 的系列问题中,有一类问题是 内存碎片化 导致的,而且这种更容易发生在 LOH 上,因为它默认不开启 对象压缩,一般遇到这种情况,优先让朋友执行下面的代码应急. GCSettin ...
- 解析Java的JNI编程中的对象引用与内存泄漏问题
JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native ...
- 关于 Unity 项目中的 Mono 堆内存泄露
关于 Unity 项目中的 Mono 堆内存泄露 题记:这是补一篇应该在将近一年前就应该写的记录,今天终于补上. 内存泄露是一个老话题了,之前我专门写过一篇 排查 Lua 虚拟机内存泄露 的文章,并且 ...
- 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型
小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...
- 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...
- 5个Android开发中比较常见的内存泄漏问题及解决办法
android中一个对象已经不需要了,但是其他对象还持有他的引用,导致他不能回收,导致这个对象暂存在内存中,这样内存泄漏就出现了. 内存泄漏出现多了,会是应用占用过多的没存,当占用的内存超过了系统 ...
- PerfView专题 (第十篇):洞察 C# 终结队列引发的内存泄漏
一:背景 C# 程序内存泄漏的诱发因素有很多,但从顶层原理上来说,就是该销毁的 用户根 对象没有被销毁,从而导致内存中意料之外的对象无限堆积,导致内存暴涨,最终崩溃,这其中的一个用户根就是 终结器队列 ...
- 第二十三篇、使用NSURLSession时需要注意一个内存泄漏问题
如图1代码所示,初始化一个NSURLSession临时实例对象并由它发起一个网络请求.我们通过Instruments的Leaks工具会发现其存在内存泄漏和循环引用的地方,如图2所示. 通过NSURLS ...
- 在 Linux 平台中调试 C/C++ 内存泄漏方法(转)
由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误.同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的后果.本文将从静态分析和动态检测两 ...
随机推荐
- spring boot 在控制台打印banner
转自 SpringBoot系列--花里胡哨的banner.txt - huanzi-qch - 博客园 (cnblogs.com) <div id="cnblogs_post_body ...
- 彰显个性│github和gitlab之自定义首页样式
目录 一.个性首页 二.制作步骤 三.修改内容 一.个性首页 相信很多小伙伴在逛 github 和 gitlab 的时候 会发现很多开发者的首页异常的炫酷,如 https://github.com/c ...
- Egg上层框架CabloyJS是如何输出SQL语句日志的?
背景 在Egg开发实践中,经常会遇到一个问题:如何查看刚刚执行过的Egg组装的原生SQL语句呢? 1. 现有方案 可以直接在项目的config配置文件中添加MySQL配置debug: true.这会启 ...
- bitmap技术解析:redis与roaringBitmap
bitmap的表象意义是,使用一个01标识位来表示是否的状态,可以达到节省空间和高效判定的效果.在我们的实际工作中,也有着许多的应用场景,相信了解bitmap定会给你带来一些额外的收获. 1. bit ...
- c# sqlsugar,hisql,freesql orm框架全方位性能测试对比 sqlserver 性能测试
在2022年1月份本人做过一次sqlsugar,hisql,freesql三个框架的性能测试,上次主要是测的sqlserver下的常规插入(非bulkcopy的方式数据插入),hisql与目前比较流行 ...
- vue大型电商项目尚品汇(后台篇)day05
今天继续是对后台管理部分的一个操作,但是快要结束了,今天结束,明天会进入一个从Vue以来,另外一个名声显著的东西了,一只耳闻从未见识,而且十分的炫酷 他就是------数据可视化Echarts,迫不及 ...
- SAP Smart Form 无法通过程序自定义默认打印机问题解决
*&---------------------------------------------------------------------* *& Form FRM_SET_PRI ...
- VisionPro · C# · 图像显示十字光标
程序通过 CogRecordDisplay 显示控件显示视觉运行结果图像,当我们对调试时,可能需要用到图像中心十字对位光标. 本文通过VisionPro两个拟合线工具,一个拟合圆工具在图像中画出光标, ...
- 深入理解 volatile 关键字
volatile 关键字是 Java 语言的高级特性,但要弄清楚其工作原理,需要先弄懂 Java 内存模型.如果你之前没了解过 Java 内存模型,那可以先看看之前我写过的一篇「深入理解 Java 内 ...
- windows脚本bat做文件备份
@ECHO OFF echo 切换到当前目录... cd /d %~dp0% echo 开始复制Code1... echo d | XCOPY Code1 ..\备份\bakdir\Code1 /s ...