【问题标题】:WinDbg Memory analysisWinDbg 内存分析
【发布时间】:2014-11-20 07:11:58
【问题描述】:

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 总计高达 ~2 GB,而托管内存仅使用 500 GB,所以我面临本机内存泄漏?

【问题讨论】:

  • 我建议您使用一些 .NET 内存分析器。他们以更友好的方式显示数据
  • 您确定崩溃是由于内存不足异常造成的吗?
  • @Marc Sherman:在异常开始弹出后立即进行了转储

标签: .net wpf out-of-memory windbg


【解决方案1】:

免费的意义

Usage Summary 的 FreeMEM_FREE 的意思是:内存是空闲的,可以分配。它没有被.NET分配,到目前为止也没有被本机代码分配。

但是,您甚至可以获得具有 2 GB 可用内存的 OutOfMemoryException,例如通过做

byte[] oops = new byte[Int.MaxValue];

所以问题是:尝试分配多少内存与当时有多少可用内存?

碎片化

查看 FreeMEM_FREE 是不够的,特别是如果您想分配对象数组,这些对象一个接一个地按顺序放置。在这种情况下,单个块中必须有足够的内存。

因此,您必须查看按使用情况划分的最大区域部分,您会发现免费只有 110 MB。因此,任何人都不可能将超过 110 MB 的 new 内存分配为单个块(无论是本机还是 .NET)。

确切地说:这并不一定意味着您根本不能分配 110 MB。在 old 内存的帮助下,这可能是可能的,例如.NET 可以进行垃圾收集,发现有 120 MB 可用空间并使用它,而不是请求 110 MB 的 内存。

最终答案

很遗憾,根据所提供的信息,无法说出确切的原因。 您可能想关注my flowchart for OutOfMemoryException analysis 并阅读问题How to identify array type,它还提供了有关如何从转储文件中识别数组大小的见解。

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    相关资源
    最近更新 更多