配置:
File->Symbol path-> SRV*C:\symbols*http://msdl.microsoft.com/download/symbols
载入sos.dll 执行.load C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll
命令:
1. !threadpool 查看当前CPU状况 线程数等等
2. !runaway 查看那几个线程使用的高 建议多抓几个dump 然后确定到底是哪个线程
3. ~线程IDs 跳转到那个线程
4. !threads查看所有线程。
5. (3后)!clrstack 看看这个线程再干嘛 执行那些方法
6. !clrstack -p 具体方法的参数值地址
7. !do 地址 查看参数值
8. !dso 查看当前线程里有哪些对象
9. !analyze -v 自动分析故障。
10.!heap -s 查看所有堆
11. !heap -stat -h 004d0000 因发现这个堆里有较大的内存占有量.
12. !heap -flt s 24d58 来查看堆里的内存分配
13. !heap -p -a 722a9b20 就会把调用到DLL的方法显示出来,就是内存泄露的地方
14. !eeheap -gc,通过这个命令可以知道现在垃圾回收堆中数据的基本情况
15. !dumpheap -stat,这个命令是将gc里面的对象一一开列出来,什么类,占了多少空间,因为对于引用对象,对象本身是很小的,关键是引用的对象的判断。所以通过这个我们只能看到是什么占了大空间.
16.!dumpheap -type System.Net.Sockets.SocketAsyncEventArgs
通过这个命令看看System.Net.Sockets.SocketAsyncEventArgs这个对象里面都定义了些什么,都引用了些什么。SOS中定义这个命令的意义是罗列出所有的名字匹配“System.Net.Sockets.SocketAsyncEventArgs”的类所在的内存地址 。
(15后如果我们发现System.Byte[]占用了较多的空间,我们可以推测是什么对象引起的比如System.Net.Sockets.SocketAsyncEventArgs)
17. !objsize 150905e8
18. !dumpobj 02213840
!do 02213858(注:do的意思就是dumpobj)
19. !dumparray 02213880