tl;dr;:我的假设是正确的,这是一个非托管内存泄漏吗?
我有一个.net 4 WPF应用程序崩溃与内存不足的异常。使用内存转储时,我需要一些关于阅读它们的建议:
从!address -summary开始
--- Usage Summary ----- RgnCount --------Total Size -------- %ofBusy %ofTotal
unknown 1863 37b80000 ( 891.500 Mb) 71.62% 43.53%
Free 415 3233d000 ( 803.238 Mb) 39.22%
Image 1542 10327000 ( 259.152 Mb) 20.82% 12.65%
Heap 83 493e000 ( 73.242 Mb) 5.88% 3.58%
Stack 67 1480000 ( 20.500 Mb) 1.65% 1.00%
Other 12 37000 ( 220.000 kb) 0.02% 0.01%
TEB 22 16000 ( 88.000 kb) 0.01% 0.00%
PEB 1 1000 ( 4.000 kb) 0.00% 0.00%
--- Type Summary (for busy) -- RgnCount ---------- Total Size -------- %ofBusy %ofTotal
MEM_PRIVATE 900 30b7e000 ( 779.492 Mb) 62.62% 38.06%
MEM_IMAGE 2619 157c3000 ( 343.762 Mb) 27.62% 16.79%
MEM_MAPPED 71 7972000 ( 121.445 Mb) 9.76% 5.93%
--- State Summary ---------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_COMMIT 2874 43753000 ( 1.054 Gb) 86.71% 52.70%
MEM_FREE 415 3233d000 ( 803.238 Mb) 39.22%
MEM_RESERVE 716 a560000 ( 165.375 Mb) 13.29% 8.08%
--- Protect Summary (for commit) - RgnCount ---- Total Size --- %ofBusy %ofTotal
PAGE_READWRITE 1004 26c48000 ( 620.281 Mb) 49.83% 30.29%
PAGE_EXECUTE_READ 302 10f1e000 ( 271.117 Mb) 21.78% 13.24%
PAGE_READONLY 812 7044000 ( 112.266 Mb) 9.02% 5.48%
PAGE_READWRITE|PAGE_WRITECOMBINE 8 22e6000 ( 34.898 Mb) 2.80% 1.70%
PAGE_WRITECOPY 370 1ebf000 ( 30.746 Mb) 2.47% 1.50%
PAGE_EXECUTE_READWRITE 238 717000 ( 7.090 Mb) 0.57% 0.35%
PAGE_EXECUTE_WRITECOPY 96 287000 ( 2.527 Mb) 0.20% 0.12%
PAGE_READWRITE|PAGE_GUARD 44 66000 ( 408.000 kb) 0.03% 0.02%
--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
unknown 2150000 186e000 ( 24.430 Mb)
Free 77ffd000 6efb000 ( 110.980 Mb)
Image 68d43000 f1e000 ( 15.117 Mb)
Heap 3c78c000 e04000 ( 14.016 Mb)
Stack 2050000 fd000 (1012.000 kb)
Other 7efb0000 23000 ( 140.000 kb)
TEB 7eefa000 1000 ( 4.000 kb)
PEB 7efde000 1000 ( 4.000 kb)运行!eeheap,我将获得GC堆大小
GC Heap Size: Size: 0x1f796cdc (528051420) bytes.
我是对的吗:总的进程内存是mem_commit + mem_free + mem_reserve,总计高达2GB,而托管内存仅使用500 GB,所以我面临着本地内存泄漏吗?
发布于 2014-11-20 20:28:03
自由的意义
“使用摘要”的 free 和MEM_FREE的确切含义是:内存是空闲的,可以分配。到目前为止,它还没有被.NET分配,也没有被本机代码分配。
但是,您甚至可以获得一个具有2GB空闲内存的OutOfMemoryException,例如通过
byte[] oops = new byte[Int.MaxValue];所以问题是:尝试分配多少内存,而当时有多少内存是空闲的?
碎裂
只看Free或MEM_FREE是不够的,特别是如果您想要分配对象数组,这些对象是按顺序排列的。在这种情况下,一个块中必须有足够的内存。
因此,您必须查看最大区域(按的用法)部分,并在其中找到只有110 MB的Free。因此,任何人都不可能将超过110 MB的新内存作为单个块分配(既不是本机内存,也不是.NET)。
准确地说:这并不一定意味着你根本不能分配110 MB。在旧内存的帮助下,这是可能的,例如.NET可以进行垃圾收集,发现有120 MB空闲,并使用它而不是要求110 MB的新内存。
最终答案
不幸的是,由于提供了这些信息,不可能说出确切的原因。您可能希望遵循my flowchart for OutOfMemoryException analysis并阅读问题How to identify array type,这也让您了解如何从转储文件中识别数组大小。
https://stackoverflow.com/questions/27033776
复制相似问题