记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析相关的知识,希望对你有一定的参考价值。

一:背景

1. 讲故事

说实话,这篇dump我本来是不准备上一篇文章来解读的,但它有两点深深的感动了我。

  1. 无数次的听说用 Unity 可做游戏开发,但百闻不如一见。

  2. 游戏中有很多金庸武侠小说才有的名字,太赏心悦目了。


000000df315978a8    0          3   玉骨扇
000000df31597cd8    0          3   云龙枪
000000df31596d88    0          3   阴风爪
000000df315967a8    0          4   雪魂丝链
000000df31596ad0    0          4   乙木神剑
000000df31596040    0          3   星耀冠
000000df31595328    0          3   乌金锤
...

所以说这么好的一个dump,我得给它留下点什么。

好了,话说回来这个缘分起于上个月有位朋友说它的程序虚拟内存占用非常大,咨询如何解决,如下图:

先甭管是什么问题,多抓几个dump总不会错的,几经折腾后发了一个dump过来。

二: Windbg 分析

1. 到底是哪里的泄漏

分析内存方面的问题,还是那句话,一分为二看一下到底是哪一块的内存泄漏(托管还是非托管)。

先看一下进程总内存,使用 !address -summary 命令。


0:087> !address -summary

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free                                    458     7ffe`9e6a8000 ( 127.995 TB)          100.00%
Heap                                  48514        1`005fd000 (   4.006 GB)  72.51%    0.00%
<unknown>                              2504        0`2c6ad000 ( 710.676 MB)  12.56%    0.00%
Stack                                   504        0`2a000000 ( 672.000 MB)  11.88%    0.00%
Image                                   410        0`0a971000 ( 169.441 MB)   3.00%    0.00%
Other                                    18        0`001dc000 (   1.859 MB)   0.03%    0.00%
TEB                                     168        0`00150000 (   1.312 MB)   0.02%    0.00%
PEB                                       1        0`00001000 (   4.000 kB)   0.00%    0.00%

--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_PRIVATE                           51581        1`5130f000 (   5.269 GB)  95.36%    0.00%
MEM_IMAGE                               416        0`0aa6b000 ( 170.418 MB)   3.01%    0.00%
MEM_MAPPED                              122        0`05bce000 (  91.805 MB)   1.62%    0.00%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_FREE                                458     7ffe`9e6a8000 ( 127.995 TB)          100.00%
MEM_COMMIT                            51465        1`1c741000 (   4.445 GB)  80.45%    0.00%
MEM_RESERVE                             654        0`45207000 (   1.080 GB)  19.55%    0.00%

从卦中得知 MEM_COMMIT=4.4G, 接下来再看下托管堆的内存占用,可以用命令 !eeheap -gc 命令。


0:087> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x000000df3118dc48
generation 1 starts at 0x000000df3118b098
generation 2 starts at 0x000000df30fc1000
ephemeral segment allocation context: none
         segment             begin         allocated              size
000000df30fc0000  000000df30fc1000  000000df3178cae0  0x7cbae0(8174304)
Large object heap starts at 0x000000df40fc1000
         segment             begin         allocated              size
000000df40fc0000  000000df40fc1000  000000df410637b8  0xa27b8(665528)
Total Size:              Size: 0x86e298 (8839832) bytes.
------------------------------
GC Heap Size:            Size: 0x86e298 (8839832) bytes.


从卦中得知 GC Heap Size= 8839832 Byte = 8M,我去,才这么点,有点开玩笑哈!!!

以上是关于记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析的主要内容,如果未能解决你的问题,请参考以下文章

记一次 .NET 某打印服务 非托管内存泄漏

记一次 .NET 某工控视觉软件 非托管泄漏分析

记一次 .NET 某智慧水厂API 非托管内存泄漏分析

记一次 .NET 某智慧水厂API 非托管内存泄漏分析

记一次 .NET 某电厂Web系统 内存泄漏分析

记一次 .NET 某电厂Web系统 内存泄漏分析