记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析相关的知识,希望对你有一定的参考价值。
一:背景
1. 讲故事
说实话,这篇dump我本来是不准备上一篇文章来解读的,但它有两点深深的感动了我。
-
无数次的听说用 Unity 可做游戏开发,但百闻不如一见。
-
游戏中有很多金庸武侠小说才有的名字,太赏心悦目了。
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 某桌面奇侠游戏 非托管内存泄漏分析的主要内容,如果未能解决你的问题,请参考以下文章