C#的内存增长不易通过umdh查询出来

说明

UMDH 的字面意思是The user-mode dump heap utility (用户模式转储堆实用程序)它是一款轻量级的内存泄露分析工具。

以前使用过umdh查询过vc上的内存泄漏,通过比较的方法,比较出一段时间之后,内存的增长情况。
但是c#可以使用这个工具吗?

我写了一个简单c#app,不要内容如下:
c#测试代码

    public class MyThread
    {
        public void Thread1()
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(2000);
                Int32[] xx = new Int32[i];
                Console.WriteLine(xx.Length);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello,this is my .Net program.");
            MyThread mt = new MyThread();
            Thread t1 = new Thread(new ThreadStart(mt.Thread1));
            Thread t2 = new Thread(new ThreadStart(mt.Thread1));
            t1.Start();
            t2.Start();

        }
    }

分析步骤

然后使用
调用umdh -pn:aa.exe -f:dump1.txt 记录一个内存堆栈
过段时间后,调用umdh -pn:aa.exe -f:dump2.txt记录另一个
然后调用umdh dump1.txt dump2.txt -f:result.txt比较改变,内容如下:
可以看到和vc差别很多,不能定位到具体的哪一行,大致能能看出来,可能是出现新的内存申请(alloc)不能像vc一样直接可以定位到哪个函数,哪个api。
 


// Debug library initialized ...
DBGHELP: console_cs - private symbols & lines 
         F:\works\Works_Cs\winform\bin\Debug\console_cs.pdb

+     d68 (  1f48 -  11e0)      7 allocs    BackTrace1C347A0
+       3 (     7 -     4)    BackTrace1C347A0    allocations

    ntdll! ?? ::FNODOBFM::`string'+000153CB
    mscoreei!calloc_impl+0000005D
    mscoreei!calloc_crt+00000033
    mscoreei!CRT_INIT+00000107
    mscoreei!__DllMainCRTStartup+0000007A
    mscoreei!OnShimDllMainCalled+00000056
    MSCOREE!DllMain+00000064
    MSCOREE!CRT_INIT+000001B8
    ntdll!LdrpInitializeThread+0000017C
    ntdll!LdrpInitialize+0000009F
    ntdll!LdrInitializeThunk+0000000E

+     d68 (  1f48 -  11e0)      7 allocs    BackTrace1C34B60
+       3 (     7 -     4)    BackTrace1C34B60    allocations

    ntdll! ?? ::FNODOBFM::`string'+000153CB
    MSVCR120_CLR0400!calloc_impl+0000005D
    MSVCR120_CLR0400!calloc_crt+00000033
    MSVCR120_CLR0400!__CRTDLL_INIT+00000124
    ntdll!LdrpInitializeThread+0000017C
    ntdll!LdrpInitialize+0000009F
    ntdll!LdrInitializeThunk+0000000E

+     c30 (  1c70 -  1040)      7 allocs    BackTrace1C346E0
+       3 (     7 -     4)    BackTrace1C346E0    allocations

    ntdll! ?? ::FNODOBFM::`string'+000153CB
    ntdll!RtlProcessFlsData+00000125
    KERNELBASE!FlsSetValue+0000005D
    MSCOREE!CRT_INIT+000000FE
    MSCOREE!CRT_INIT+0000019F
    ntdll!LdrpInitializeThread+0000017C
    ntdll!LdrpInitialize+0000009F
    ntdll!LdrInitializeThunk+0000000E

......

已经很久没有接触c#了,也许它已经有了很好的内存测试工具。如果是普通的客户端应用,它自身的内存回收机制会处理好这些的。

关于:

编者:李国帅

qq:9611153 微信lgs9611153

时间:2021-12-12  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值