内存中空闲空间不少,但是连续的空闲空间却只有100k。
0:000> !address -summary
--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
<unknown> 6853 441d3000 ( 1.064 Gb) 62.82% 53.22%
Heap 4070 1b525000 ( 437.145 Mb) 25.20% 21.35%
Free 5606 13912000 ( 313.070 Mb) 15.29%
Image 1928 b119000 ( 177.098 Mb) 10.21% 8.65%
Stack 348 1d00000 ( 29.000 Mb) 1.67% 1.42%
Other 23 158000 ( 1.344 Mb) 0.08% 0.07%
TEB 116 74000 ( 464.000 kb) 0.03% 0.02%
PEB 1 1000 ( 4.000 kb) 0.00% 0.00%
--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_PRIVATE 5214 5d197000 ( 1.455 Gb) 85.86% 72.74%
MEM_IMAGE 3200 d945000 ( 217.270 Mb) 12.52% 10.61%
MEM_MAPPED 4925 1c02000 ( 28.008 Mb) 1.61% 1.37%
--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_RESERVE 3371 39fe0000 ( 927.875 Mb) 53.48% 45.31%
MEM_COMMIT 9968 326fe000 ( 806.992 Mb) 46.52% 39.41%
MEM_FREE 5606 13912000 ( 313.070 Mb) 15.29%
--- Protect Summary (for commit) - RgnCount ----------- Total Size -------- %ofBusy %ofTotal
PAGE_READWRITE 2965 2399c000 ( 569.609 Mb) 32.83% 27.81%
PAGE_EXECUTE_READ 459 a357000 ( 163.340 Mb) 9.42% 7.98%
PAGE_READONLY 6115 3941000 ( 57.254 Mb) 3.30% 2.80%
PAGE_WRITECOPY 153 b12000 ( 11.070 Mb) 0.64% 0.54%
PAGE_EXECUTE_READWRITE 109 3fb000 ( 3.980 Mb) 0.23% 0.19%
PAGE_EXECUTE_WRITECOPY 51 102000 ( 1.008 Mb) 0.06% 0.05%
PAGE_READWRITE|PAGE_GUARD 116 bb000 ( 748.000 kb) 0.04% 0.04%
--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
<unknown> 46da1000 23ff000 ( 35.996 Mb)
Heap 6d110000 2b30000 ( 43.188 Mb)
Free 7c647000 19000 ( 100.000 kb)
Image 35a6f000 cc5000 ( 12.770 Mb)
Stack f80000 3d000 ( 244.000 kb)
Other 3a0000 103000 ( 1.012 Mb)
TEB 7fec0000 1000 ( 4.000 kb)
PEB 7ffd3000 1000 ( 4.000 kb)
通过!address命令直接查看下内存分布情况,发现内存中全是如下形式
+ 7fce0000 7fce1000 1000 MEM_MAPPED MEM_COMMIT PAGE_READONLY <unknown>
+ 7fce1000 7fcf0000 f000 MEM_FREE PAGE_NOACCESS Free
+ 7fcf0000 7fcf1000 1000 MEM_MAPPED MEM_COMMIT PAGE_READONLY <unknown>
+ 7fcf1000 7fd00000 f000 MEM_FREE PAGE_NOACCESS Free
+ 7fd00000 7fd01000 1000 MEM_MAPPED MEM_COMMIT PAGE_READONLY <unknown>
+ 7fd01000 7fd10000 f000 MEM_FREE PAGE_NOACCESS Free
+ 7fd10000 7fd11000 1000 MEM_MAPPED MEM_COMMIT PAGE_READONLY <unknown>
+ 7fd11000 7fd20000 f000 MEM_FREE PAGE_NOACCESS Free
+ 7fd20000 7fd21000 1000 MEM_MAPPED MEM_COMMIT PAGE_READONLY <unknown>
+ 7fd21000 7fd30000 f000 MEM_FREE PAGE_NOACCESS Free
+ 7fd30000 7fd43000 13000 MEM_PRIVATE MEM_COMMIT PAGE_READWRITE <unknown>
+ 7fd43000 7fd50000 d000 MEM_FREE PAGE_NOACCESS Free
+ 7fd50000 7fd51000 1000 MEM_MAPPED MEM_COMMIT PAGE_READONLY <unknown>
+ 7fd51000 7fd60000 f000 MEM_FREE PAGE_NOACCESS Free
+ 7fd60000 7fd61000 1000 MEM_MAPPED MEM_COMMIT PAGE_READONLY <unknown>
+ 7fd61000 7fd70000 f000 MEM_FREE PAGE_NOACCESS Free
+ 7fd70000 7fd71000 1000 MEM_MAPPED MEM_COMMIT PAGE_READONLY <unknown>
查看其中内存内容,发现是GIF格式的图片占用了空间
0:000> dc 7fcf0000
7fcf0000 38464947 00786139 00f7001e 7b787200 GIF89ax......rx{
7fcf0010 dff5efe2 e8dcf2ec f3ede0ee d7f4eee1 ................
7fcf0020 aea5e9e4 e4ded2b2 9e918d86 bbb1aca8 ................
7fcf0030 8e8a83c0 9bebe6d9 d0c5a8a4 b1aca3d5 ................
7fcf0040 ddb5b1a7 e8dbefe9 dbd6caed a4c9c4b9 ................
7fcf0050 968eb2ad c8c3b899 c2beb9af c9bfd2cd ................
7fcf0060 7c7973ce debbb7ad 857ef0ea 9b988f88 .sy|......~.....
7fcf0070 96e7e1d5 9088a39e e8e2d694 8ed4cfc4 ................
通过如下命令查看这种形式的内存使用,居然有4873处,计算一下 (f000+1000) * 4873 = 319356928, 占用了300多MB空间,难怪空闲空间很多,但是连续的又这么少。
0:000> .shell -ci "!address" find /C "1000 MEM_MAPPED MEM_COMMIT PAGE_READONLY <unknown>"
4873
.shell: Process exited
一般来说<unknown>内存空间是被managed程序占用,查看一下finalizequeue,发现里面正好有4000多个bitmap
0x7ae3c9f8 4,884 117,216 System.Drawing.Bitmap
解决方法就是在使用完bitmap之后直接调用dispose释放掉unmanaged资源,不要等待finalize被调用。