天天看點

另一種形式的OufOfMemoryException

記憶體中空閑空間不少,但是連續的空閑空間卻隻有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被調用。

繼續閱讀