上篇文章给大家解释了Windbg的基本命令和说明,这一篇给大家介绍内存泄露场景的问题分析。

文章大纲:

  1. 描述问题背景和现象
  2. 确定问题是否是内存泄露
  3. 梳理问题分析思路
  4. 动手分析解决
  5. 总结

1. 先说问题背景:生产环境IIS站点,运行一段时间后,w3wp进程内存会涨到2G,同时内存不释放。

2. 问题确认

打开性能计数器,我们重点看一段时间内,IIS站点w3wp进程相关的性能计数器的变化:

性能计数器中:有三个非常重要:

.NET CLR Memory/Gen 2 heap size
.NET CLR Memory/Gen 1 heap size
.NET CLR Memory/Gen 0 heap size
托管堆上的对象有三代:
第 0 代: 这是最年轻的代,其中包含短生存期对象。 短生存期对象的一个示例是临时变量。 垃圾回收最常发生在此代中。新分配的对象构成新一代的对象并且为隐式的第 0 代回收,除非它们是大对象,在这种情况下,它们将进入第 2 代回收中的大对象堆。大多数对象通过第 0 代中的垃圾回收进行回收,不会保留到下一代。
第 1 代: 这一代包含短生存期对象并用作短生存期对象和长生存期对象之间的缓冲区。
第 2 代: 这一代包含长生存期对象。 长生存期对象的一个示例是服务器应用程序中的一个包含在进程期间处于活动状态的静态数据的对象。当条件得到满足时,垃圾回收将在特定代上发生。 回收某个代意味着回收此代中的对象及其所有更年轻的代。 第 2 代垃圾回收也称为完整垃圾回收FullGC,因为它回收所有代上的所有对象(即,托管堆中的所有对象)。
幸存和提升:垃圾回收中未回收的对象也称为幸存者,并会被提升到下一代。 在第 0 代垃圾回收中幸存的对象将被提升到第 1 代;在第 1 代垃圾回收中幸存的对象将被提升到第 2 代;而在第 2 代垃圾回收中幸存的对象将仍为第 2 代。
通过代提升,看对象的存活时间!

Process/Private Bytes
Process/Virtual Bytes
.NET CLR Memory/# Bytes in all Heaps : CLR内存托管堆的大小
.NET CLR Memory/Large Object Heap Size: 大对象堆包含其大小为 85,000 个字节和更多字节的对象。

托管堆的内存大小增加的趋势和大对象堆增加的趋势重叠,可以初步推断,内存的增加和大对象有关系!

3. 梳理问题分析思路

连续、间隔抓两个或者三个Dump,每次抓Dump间隔半个小时,或者一个小时,主要看内存的增量。


对比的看每个Dump中:

  • 多核CPU情况下,分析每个GC托管堆的大小 !eeheap –gc
  • 查询内存中各类对象的总个数和总内存占用 !dumpheap –stat
  • 查询内存中大对象的个数和对象大小 !dumpheap –stat -mt -min 5000 -max 100000
  • 如果某一类或者几类对象的内存总占用很多,分析此类对象 !dumpheap –mt ***
  • 多次采样查看步骤4中对象的gcroot !gcroot addr
  • 打断gcroot中任何一个链条,释放对象引用

4. 动手分析

  • 多核CPU情况下,分析每个GC托管堆的大小 !eeheap –gc

  • 查询内存中各类对象的总个数和总内存占用 !dumpheap –stat

  • 查询内存中大对象的个数和对象大小 !dumpheap –stat -mt -min 5000 -max 100000

  • 如果某一类或者几类对象的内存总占用很多,分析此类对象 !dumpheap –mt *** -stat

大对象字符串分析,Session会话数据!同时Session会话中包含了权限数据!

  • 多次采样查看步骤4中对象的gcroot !gcroot addr

  • 打断gcroot中任何一个链条,释放对象引用

5. 总结

总结一下,内存泄露问题分析,有固定的方法和指令,过程需要大家深入理解,同时熟悉代码非常重要,因为需要找出gcroot,分析出内存泄露的原因,再进行修改解决。

大的套路:

  • 描述问题背景和现象
  • 确定问题是否是内存泄露
  • 梳理问题分析思路
  • 动手分析解决
  • 总结

详细的分析步骤:

  • 多核CPU情况下,分析每个GC托管堆的大小 !eeheap –gc
  • 查询内存中各类对象的总个数和总内存占用 !dumpheap –stat
  • 查询内存中大对象的个数和对象大小 !dumpheap –stat -mt -min 5000 -max 100000
  • 如果某一类或者几类对象的内存总占用很多,分析此类对象 !dumpheap –mt ***
  • 多次采样查看步骤4中对象的gcroot !gcroot addr
  • 打断gcroot中任何一个链条,释放对象引用

欢迎大家补充。

周国庆

2018/10/30

Windbg程序调试系列2-内存泄露问题的更多相关文章

  1. Windbg程序调试系列3-线程阻塞问题

    上一篇博文给大家分享了使用Windbg分析内存泄露问题: Windbg程序调试系列2-内存泄露问题 本篇我们继续跟大家分享,如何分析解决线程阻塞问题. 从根本上讲,线程阻塞属于程序Hang的一种,其表 ...

  2. Windbg程序调试系列-索引篇

    最近整理了一下Windbg程序调试系列的文章,做个了索引贴,方便大家查询.搜索: Windbg程序调试系列1-常用命令说明&示例 Windbg程序调试系列1-Mex扩展使用总结 Windbg程 ...

  3. Windbg程序调试系列4-Live Debugging

    上篇博文中给大家分享了使用Windbg分析线程阻塞问题: Windbg程序调试系列3-线程阻塞问题 本篇中我们继续,跟大家分享附加进程实时调试-Live Debugging. 先说一下使用Windbg ...

  4. Windbg程序调试系列5-高CPU问题分析

    上篇博客中给大家分享了使用Windbg进行Live Debugging: Windbg程序调试系列4-Live Debugging 本篇中我们继续,跟大家分享常见的应用程序高CPU使用率问题分析. 先 ...

  5. Windbg程序调试系列1-常用命令说明&示例

    Windbg程序调试是.Net高级开发需要掌握的必备技能,分析内存泄露.分析高CPU.分析线程阻塞.分析内存对象.分析线程堆栈.Live Dedugging.这个领域可以说一个技能+场景化应用的结合, ...

  6. Windbg程序调试系列1-Mex扩展使用总结

    最近一直在频繁使用Windbg做线上Dump调试,与微软做Case交流的时候,发现微软CSS团队,用了一个非常效率的Windbg 插件,Mex: 使用介绍: https://blogs.msdn.mi ...

  7. Windows程序调试系列: 使用VC++生成调试信息 转

    Windows程序调试系列: 使用VC++生成调试信息 ZhangTao,zhangtao.it@gmail.com, 译自 “Generating debug information with Vi ...

  8. Windbg调优Kafka.Client内存泄露

    从来没写过Blog,想想也是,工作十多年了,搞过N多的架构.技术,不与大家分享实在是可惜了.另外,从传统地ERP行业转到互联网,也遇到了很所前所未有的问题,原来知道有一些坑,但是不知道坑太多太深.借着 ...

  9. Windbg程序调试--转载

    WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件. WinDbg是微软很重要的诊断调试工具: 可以查 ...

随机推荐

  1. echarts网络拓扑图

    option = { title: { text: '' }, tooltip: {}, animationDurationUpdate: 1500, animationEasingUpdate: ' ...

  2. Delphi过程函数传递参数的几种方式

    Delphi过程函数传递参数的几种方式  在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out. 另一种不加修饰符的为默认按值传递参数. 一.默认方式以值方式传递参数 proced ...

  3. npm install 错误 安装 chromedriver 失败的解决办法

    npm 安装 chromedriver 失败的解决办法npm 安装 chromedriver 时,偶尔会出错,错误提示类似于:npm ERR! chromedriver@2.35.0 install: ...

  4. Serv-u 备份处理

    需求分析 从删库到跑路,大家听过很多,但如果没删备份的话,那只能说玩的不够彻底,不专业.系统管理员一个非常重要的职责就是定期备份,以便在系统出现故障的时候能够及时恢复.我们来看下如何备份Serv-u系 ...

  5. LDA总结 (一) 共轭分布

    今天开始,复习一下 LDA ,记录一些 LDA 的关键步骤,为写好论文做铺垫.第一节的主题是共轭分布,回忆贝叶斯公式: \[p(\theta|X) = \frac{p(\theta) \cdot p( ...

  6. 从composer上在本地创建一个项目

    在想要创建项目的目录下,输入以下代码

  7. vue2中使用transition

    最终效果为  div元素从右向左出现, 然后从左向右消失. transition标签包裹要移动的元素: css 样式: 其中: 1:  为div元素显示时的状态 2:  为div元素移动的过程 (进入 ...

  8. 非常实用的使用eclipse的快捷键和技巧

    解决代码的自动提示问题: 1.打开 Eclipse -> Window -> Perferences 2.找到Java 下的 Editor 下的 Content Assist , 右边出现 ...

  9. 28. css样式中px转rem

    Vue3:脚手架配置 https://blog.csdn.net/weixin_41424247/article/details/80867351 与原来的vue-cli 2.x版本不同的是:如果使用 ...

  10. vue的插槽slot

    插槽是写在子组件上,用啦留给父级添加内容的位置接口: 1. 父级里的 <template :is='子标签名'>父插入内容</template>标签,里的内容       sl ...