Windbg + .Net .NET Memory Profiler 排查内存泄露
这是一个Winform程序,用于项目中的定时运算。症状是,运行一段时间后,内存持续上升。如一天内就能够达到300M。
打开.Net Memory Profiler,监控该程序,一段时间后,看到该程序产生了大量的Int32[]与string。

于是跟着这些个Int32数组与字符串乱点,发现引用链还有很多不同的。
为什么这些Int32数组不被回收呢?
打开Windbg,输入如下命令:
:> !finalizequeue
SyncBlocks to be cleaned up:
MTA Interfaces to be released:
STA Interfaces to be released:
----------------------------------
generation has finalizable objects (45db4e24->45db4e24)
generation has finalizable objects (45db4e20->45db4e24)
generation has finalizable objects (45ce0020->45db4e20)
Ready for finalization objects (45db4e24->45db5e08)
Statistics:
MT Count TotalSize Class Name
...通通省略
07fec4d4 System.WeakReference
09d645c8 System.Diagnostics.PerformanceCounter
0b15b068 System.Reflection.Emit.DynamicResolver+DestroyScout
0961fd18 System.Data.SqlClient.SqlDataAdapter
09d61a80 System.Data.SqlClient.SqlConnection
0b158be0 215952 8638080 System.Reflection.Emit.DynamicResolver
Total objects
finalizequeue查看的是可终结队列,只是可终结,但是还未实际终结。
从现在开始,特别留意这个对象,因为这个对象无法回收。还要特别留意被这个对象引用的对象。于是在.Net Memory Profiler中就特别留意了这个引用,原来Int32[]是被DynamicResolver引用了导致没有被回收。

为什么它未回收呢?先不管这个问题,没兴趣,我只想知道它为什么会产生这么多这个对象。而且这个对象还引用了很多其他的东西。
于是在.Net Memory Profiler中狠狠双击DynamicResolver这个对象,得知其调用堆栈如下。

问题出在同事封装的一个dll,改进同事的代码,不要再去调用这个方法。实际上一个很小的改动就搞定了。
在.Net Memory Profiler中,只要确定问题出在哪个方法就OK了。黑色的是自己的代码,而灰色的通常是已封装成.dll的第三方框架。成熟稳定的第三方框架一般不会出问题,我们只需要改进自己的代码就OK了,但是有时dll是同事封装的,这就要留点心眼了。
Windbg + .Net .NET Memory Profiler 排查内存泄露的更多相关文章
- .NET Memory Profiler 查看内存使用情况
1 简介 .Net Memory Profiler(以下简称Profiler):专门针对于.NET程序,功能最全的内存分析工具,最大的特点是具有内存动态分析(Automatic Memory Anal ...
- Android Studio 使用Memory Monitor进行内存泄露分析
在使用Android Studio进行内存泄露分析之前,我们先回顾一下Java相关的内存管理机制,然后再讲述一下内存分析工具如何使用. 一.Java内存管理机制 1. Java内存分配策略 Java ...
- Eclipse Memory Analyzer 分析内存泄露
OutOfMemoryError示例 代码 package com.walson.heap; import java.util.ArrayList;import java.util.List; /** ...
- Android内存优化7 内存检测工具1 Memory Monitor检测内存泄露
上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出 ...
- Android性能优化第(二)篇---Memory Monitor检测内存泄露
上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出 ...
- [Android Memory] App调试内存泄露之Context篇(下)
转载地址:http://www.cnblogs.com/qianxudetianxia/p/3655475.html 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用A ...
- [Android Memory] App调试内存泄露之Context篇(上)
转载自:http://www.cnblogs.com/qianxudetianxia/p/3645106.html Context作为最基本的上下文,承载着Activity,Service等最基本组件 ...
- 内存溢出(Memory Overflow)和内存泄露(Memory Leak)的区别
内存泄漏指你用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态 内存溢出指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数 ...
- 用Eclipse Memory Analyzer查找内存泄露
写在CSDN里面了 http://blog.csdn.net/dayulxl/article/details/78164301
随机推荐
- JAVA使用HBASE常用方法
package HBaseTest; /** * Created by root on 11/11/22. */ import java.io.IOException; import org.apac ...
- HTTP协议与HTTPS的区别
permike 原文 HTTP协议与HTTPS的区别 HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. HTTP是在七层网络模型中的应用层的协议,由发送请求和接受响应构成, ...
- ADO.NET(完整修改和查询、实体类,数据访问类)
一.完整修改和查询 在编写c#语句时需考虑到用户体验,例如在编写修改语句时,需要考虑到输入的内容在数据库中是否能够找到. 中间变量运用. 1.先查 2.执行操作 完整修改语句: bool has = ...
- 用happen-before规则重新审视DCL(转)
编写Java多线程程序一直以来都是一件十分困难的事,多线程程序的bug很难测试,DCL(Double Check Lock)就是一个典型,因此对多线程安全的理论分析就显得十分重要,当然这决不是说对多线 ...
- Python标准库的学习准备
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准 ...
- vi命令的使用
<转:http://linux.vbird.org/linux_basic/0310vi.php> 基本上 vi 共分为三种模式,分别是『一般模式』.『编辑模式』与『指令列命令模式』. 圖 ...
- 20145305 《Java程序设计》第5周学习总结
教材学习内容总结 1.设计错误对象都继承自java.lang.Throwable类 2.Throwable有两个子类:java.lang.Error与java.lang.Exception 3.Err ...
- poj3253
一道赫夫曼树的经典题目,一直以为这题的代码会很复杂,没想到书中竟描述地如此简单 #include <stdio.h> int n; long long p[20010]; //一道经典的赫 ...
- java类包第十一章
1.同一个包中的类互相访问,不需要制定包名. 2.java中包名的规则是全部使用小写字母 3.final 方法不能被覆盖, public class OuterClass { innerClas ...
- 使用hive访问elasticsearch的数据
使用hive访问elasticsearch的数据 1.配置 将elasticsearch-hadoop-2.1.1.jar拷贝到hive/lib hive -hiveconf hive.aux.jar ...