2024年6月15日发(作者:)

WINDBG调试.NET内存

进入WinDBG,检查托管代码

 打开WinDbg命令窗口(ALT+1)

 输入.load

!eeheap -gc

查看GC堆的大小以及G0,.G1,G2,LOH的开始地址

!dumpheap –stat

查看占用了空间的托管对象

MT Count TotalSize ClassName

MT-Method Table

Free代表被GC回收

常用参数

-type某一特定类型;如:!dumpheap –type ,列出堆上所有的String

-mt列出某一特定MethodTable的所有Object

!gcroot

得到根信息

gcroot会扫描被根引用了对象的线程

!gcroot

列举一个对象从GC树的根的路径,如果有路径存在,则认为没有被回收或不能被回收

HANDLE(Strong)表示被根化了

!finalizequeue

查看终结器队列

所有具有终结/析构器的都被注册到终结器队列中,当对象被垃圾收集时,终结器会运行析构函

数,否则在dispose函数中终结过程会挂起

如果Read for finalization>0则说明中终结器线程被堵塞,会消耗很多内存

!threads

用来罗列所有正在运行的托管(managed)线程的详细信息,如CLR线程所在的appdomain等等。

如果线程的ID显示XXXX,说明这个线程已经结束,等待被回收

-live 还存活的线程

-special显示被CLR创建的线程

!threadState

显示线程状态

ID OSID ThreadOBJ State GC Context Domain Count APT Exception

0 1 250 0019b068 a020 Disabled 02349668:02349fe8 0015def0 0 MTA

2 2 944 001a6020 b220 Enabled 00000000:00000000 0015def0 0 MTA

(Finalizer)

>!ThreadState b220

!threadPool

查看dump文件生成时的确切CPU使用率,同时可以看到队列中等待的work requests,timers

以及completion port threads等信息。Timers,work requests以及completion port threads都是

CLR的线程种类

!runaway

用来罗列所有正在运行的线程以及它们的CPU占用率

~[id]s

用于切换到某一特定线程

~是列出所有线程