使用WinDbg —— .NET篇 (六)

本文介绍了如何使用WinDbg和SOS扩展命令分析.NET应用程序中的内存泄漏问题,特别是关注根对象、大对象、非托管资源和设计原因。通过`!gcroot`命令查找对象引用,`!dumpheap`和`!gchandles`来辅助分析,揭示了内存管理的细节,并提供了解决OOM问题的基本思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6.4  

根(root)的概念原本打算放在前面讲代的概念的时候提一下,但是根的概念也涉及到终结队列和GC句柄表,所以不适合放在代里面讲;但是讲代的时候难免会涉及到根的相关概念,所以也不适合放在后面,这是个先有鸡还是先有蛋的问题,让人纠结,所以折中一下,在前面讲代的时候简单的提了下根的概念,主要把根的概念放在后面讲。

根其实就是指根对象,前面讲的概念里面也大多涉及到对象可不可达的问题。如果对象可达,就说明有至少一个根对象直接引用或间接引用了这个对象。这个根就是最原始的对象,根主要出现在几个地方:

1.  里面的局部变量和参数

2.  静态变量

3.  终结列表

4.  GC 句柄表

在这里对第一点进行补充说明:当执行GC的时候,会挂起所有所有线程,这个时候所有线程中的里面的局部变量和参数就是第一点提到的。需要注意的是,在执行GC的时候中的某个栈帧上的对象在调用当前的过程之后没有在被引用到的话,也有可能会被回收掉,所以有时候你会看到某个栈帧上的某些变量或者参数的值都找不到了。

SOS中可以使用命令“!gcroot”检测某个对象的根对象,先来看段代码:

using System;

 

namespace TestRoot

{

    class A

    {

        string _str;

        public A(string str)

        {

            _str = str;

        }

 

        public void Print()

        {

            Console.Write(_str);

        }

    }

 

    class B

    {

        private event Action

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值