这是一个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 排查内存泄露的更多相关文章

  1. .NET Memory Profiler 查看内存使用情况

    1 简介 .Net Memory Profiler(以下简称Profiler):专门针对于.NET程序,功能最全的内存分析工具,最大的特点是具有内存动态分析(Automatic Memory Anal ...

  2. Android Studio 使用Memory Monitor进行内存泄露分析

    在使用Android Studio进行内存泄露分析之前,我们先回顾一下Java相关的内存管理机制,然后再讲述一下内存分析工具如何使用. 一.Java内存管理机制 1. Java内存分配策略 Java ...

  3. Eclipse Memory Analyzer 分析内存泄露

    OutOfMemoryError示例 代码 package com.walson.heap; import java.util.ArrayList;import java.util.List; /** ...

  4. Android内存优化7 内存检测工具1 Memory Monitor检测内存泄露

    上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出 ...

  5. Android性能优化第(二)篇---Memory Monitor检测内存泄露

    上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出 ...

  6. [Android Memory] App调试内存泄露之Context篇(下)

    转载地址:http://www.cnblogs.com/qianxudetianxia/p/3655475.html 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用A ...

  7. [Android Memory] App调试内存泄露之Context篇(上)

    转载自:http://www.cnblogs.com/qianxudetianxia/p/3645106.html Context作为最基本的上下文,承载着Activity,Service等最基本组件 ...

  8. 内存溢出(Memory Overflow)和内存泄露(Memory Leak)的区别

    内存泄漏指你用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态 内存溢出指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数 ...

  9. 用Eclipse Memory Analyzer查找内存泄露

    写在CSDN里面了 http://blog.csdn.net/dayulxl/article/details/78164301

随机推荐

  1. git 命令的使用(一) add commit push pull

    一. commit 和 push 的区别 git作为支持分布式版本管理的工具,它管理的库(repository)分为本地库.远程库.git commit操作的是本地库,git push操作的是远程库. ...

  2. Java中的hashCode 方法

    http://www.cnblogs.com/dolphin0520/p/3681042.html

  3. JAVA CAS原理深度分析

    参考文档: http://www.blogjava.net/xylz/archive/2010/07/04/325206.html http://blog.hesey.net/2011/09/reso ...

  4. 使用系统UITabbarItem自定义图片显示原本颜色和自定义文字颜色

    ...... ThirdViewController *thirdVC = [[ThirdViewControlleralloc]initWithTitle:@"搜索信息"]; / ...

  5. Python标准库07 信号 (signal包,部分os包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...

  6. 使用bs4对海投网内容信息进行提取并存入mongodb数据库

    example:    http://xyzp.haitou.cc/article/722427.html 首先是直接下载好每个页面,可以使用 os.system( "wget " ...

  7. (easy)LeetCode 203.Remove Linked List Elements

    Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...

  8. 避免多层回调,Node.js异步库Async使用(parallel)

    原来写的一个分页查询,回调了好几层. exports.list = function(req,res) { var params = {}; var current_page = common_uti ...

  9. (转)一段如何調用Button.Click事件的故事

    原文地址:http://helloouc.blog.163.com/blog/static/5530527120091050314590/ 一.前言 由于小朱与BillChung的启发,想写一个故事, ...

  10. js 未结束的字符串常量错误解决方法

    1.JAVASCRIPT引用时,使用的字符语言不一致. 比如:<script type=”text/javascript” src=”xxx.js” charset=”UTF-8″>.xx ...