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
用于切换到某一特定线程
~是列出所有线程


发布评论