CPU 及内存占用过大,这也是我们日常调试工作中最常见的两个问题

首先附上两链接

一个样例演示

http://www.cnblogs.com/xioxu/archive/2009/09/04/1560326.html

一点文档信息

http://www.cnblogs.com/kissdodog/p/3731743.html

  1. 抓取 Dump 文件

    可以用工具或系统自带的命令抓取Minidump文件,但是用任务管理器抓取的是FullDump文件比较大,信息比较多,但多余的信息也多
  2. 使用 Windbg 调试 Dump 文件

    (1) 启动 Windbg 打开 Dump 文件 (File -> Open Crash Dump...)

    (2) 载入 SOS.dll

    --1、元命令loadby加载SOS .net版本相同
0:000> .load sos
0:000> .loadby sos mscorwks
Unable to find module 'mscorwks'

--2、元命令load加载SOS .net版本不相同

  如果使用的.Net版本不同,那么还可以手动指定版本,如手动指定载入4.0版本命令:

.load C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/sos.dll
.load C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/sos.dll

  如果是64位,那么应该加载如下sos.dll

.load C:/Windows/Microsoft.NET/Framework64/v2.0.50727/sos.dll
.load C:/Windows/Microsoft.NET/Framework64/v2.0.50727/sos.dll

(3) 对于 CPU 占用过高的问题,别忘了 ThreadPool 也可能是造成问题的根源。

0:000> !threadpool

可以看到线程池对cpu的利用率,线程数量,上限

(4) 我们看看是哪个线程占用 CPU 时间过多。

0:000> !runaway

(5) 切换到该线程,查看调用堆栈。

0:000> ~3 s

这里3是要切换的线程id序号在上面runaway里会显示序号

0:003> !clrstack

会显示当前线程托管代码的调用堆栈

(6) 看看这个 "Learn.CUI.Program.b__0()" 的 IL 代码。

0:003> !name2ee * dumptest.Program

name2ee显示指定模块中指定类型或方法的MethodTable结构和EEClass结构,然后就能看到模块或方法表的地址了

(7)导出模块

0:003> !dumpdomain

就可以使用MSIL反汇编器 (Ildasm.exe) 浏览模块或方法表 也可以用Reflector.exe 或者最新流行的ILSpy.exe(推荐)

然后可以查看是否是gc出了问题

大对象堆在进行full gc会耗时比较久

0:003> !eeheap -gc

显示被公共语言运行时内部数据结构使用的进程内存的有关信息

可以发现是否有内存占用比较大的段

(8) 查证这些大户的身份。

0:003> !dumpheap -min 85000 -stat

大于等于85000KB的就是大对象了

然后看是那种类型的大对象造成的

(9) 找出大户的具体内存地址。

0:003> !dumpheap -type Byte[] -min 85000

这里你找出的假设是Byte[]类型

然后会列出这种类型大对象的地址

(10) 挑一个出来,看看谁持有该大户的引用。

0:003> !gcroot 022d3250

显示对在指定地址上的一个对象的引用(或根)信息。

往上接着找找到调用它的根对象或你觉得能看出猫腻的对象

0:003> !do 012d2e2c

然后会列出对象的字段信息,和名字

然后你能根据包含的类型,和根对象的名字,根对象类型取代码里找到可能出问题的地方了。

如果cpu占用率高可以通过前面的!threadpool 或其它方式看到CPU utilization 99%,找到可能出问题的线程在压缩或者计算啥的

ProcInfo [-env] [-time] [-mem]

显示针对该进程的环境变量、内核CPU时间和内存使用统计

另外建议直接使用Jetbrains的dotMemory看内存对象数量泄露等 和 dotTrace工具看哪些东西被调用多少次,占用率等

dump 内存分析的更多相关文章

  1. java dump 内存分析 elasticsearch Bulk异常引发的Elasticsearch内存泄漏

    Bulk异常引发的Elasticsearch内存泄漏 2018年8月24日更新: 今天放出的6.4版修复了这个问题. 前天公司度假部门一个线上ElasticSearch集群发出报警,有Data Nod ...

  2. 【Android端 APP 内存分析】使用工具进行APP的内存分析

    Android端可以通过adb 命令直接获取内存信息,当然Android studio也提供了对内存的监控分析工具,并且后续可以结合MAT做分析 今天介绍的是通过Android studio和MAT工 ...

  3. 记一次Android内存分析过程

    前言 上周五的时候,祝峰找到我,反映了Android收银台买单结果页内存飙升的问题.我在自己的机器上也试着重现了一下,发现从支付台-微信支付成功并返回后,进入买单结果页的内存会突然增大,导致GC,如图 ...

  4. Android 内存分析工具 MAT(Memory Analyzer Tool)

    如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...

  5. Android内存分析工具DDMS heap + MAT 安装和使用

    一  Java内存分析工具扫盲 如果像我一样一点都不了解,可以先进行内存分析工具扫盲   MAT介绍:     Eclipse Memory Analyzer(MAT)一个功能丰富的 JAVA 堆转储 ...

  6. 利用MAT玩转JVM内存分析(一)

    本文首发于公众号:javaadu 尽管JVM提供了自动内存管理的机制,试图降低程序员的开发门槛,确实也实现了这一目标,在日常开发中,我们一般都不需要关心对象的内存释放.JVM大部分都是使用trace算 ...

  7. Android内存优化(三)详解内存分析工具MAT

    前言 在这个系列的前四篇文章中,我分别介绍了DVM.ART.内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT. 1.概述 在进行内存分析时,我们可以使用M ...

  8. Eclipse MAT内存分析工具(Memory Analyzer Tool)

    MAT内存分析工具 MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况.MAT是基于Eclipse开发的,是一款免费的性能分 ...

  9. [转] python运行时内存分析工具meliae

    转自:https://my.oschina.net/markco/blog/601773 利用meliae来监控python进程的内存占用情况 meliae是一个python进程内存占用监控.分析工具 ...

随机推荐

  1. MySQL-安装配置篇

    一.MySQL二进制安装包安装 1.环境初始化 1)创建目录mkdir /app/database --安装路径 mkdir /data/3306 --存放数据路径 mkdir /binlog/330 ...

  2. 虹软人脸识别—版本升级接口修改说明(C#)

    自虹软发布了免费.离线版本人脸识别SDK,在Github上陆续分享了各个版本对应的 C# Demo.因为公司项目一直在使用虹软的SDK,因此每当虹软官网有新版本发布,我都会进行了解,并结合Demo进行 ...

  3. 强烈推荐 16 款 IDEA 插件,让你的开发速度飞起来!

    当前使用的IDEA版本是2020.1.随着IDEA版本的升级,有些插件不再支持,而有些插件变成了收费插件,这些插件将不再推荐.以下列举的,都是亲测可以在2020.1版本的IDEA中使用的插件. 1 g ...

  4. 基于视频压缩的实时监控系统-sprint1基于epoll架构的采集端程序设计

    part1:产品功能 part2:epoll机制   select与epoll区别 1.select与epoll没有太大的区别.除了select有文件描述符限制(1024个),select每次调用都需 ...

  5. “随手记”开发记录day05

    今天完成了关于统计页面里面的总览页面 里面的功能有可以显示你这个月的花费最多的账单,和收入最多的页面 还有总计 运行效果如图所示

  6. Python实现图片滑动式验证识别

    1 abstract 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类 ...

  7. MySQL数据库——数据约束

    1 什么数据约束 对用户操作表的数据进行约束 2 默认值(缺省约束) 作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值. 注意: 1)对默认值字段插入null是可以的 2)对默认值字段可以 ...

  8. Qt之先用了再说系列-定时器的用法

    Qt 定时器是一个比好用的东西,在此就地简单记录一下使用的方式: 1.首先包含头文件 #include <QTimer> 2.具体用法有几种,我就写其中2种吧 1>执行一次 这种方式 ...

  9. C#LeetCode刷题之#190-颠倒二进制位(Reverse Bits)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4050 访问. 颠倒给定的 32 位无符号整数的二进制位. 输入: ...

  10. 解决用anaconda安装scrapy后,在使用scrapy时报错

    python版本为3.7 因为用anaconda安装scrapy非常方便,会自动下载所依赖的包, 所以就使用anaconda安装scrapy, 非常舒服,安装很成功 conda install scr ...