【问题标题】:Where memory gone (.NET application)内存去了哪里(.NET 应用程序)
【发布时间】:2014-12-03 16:27:38
【问题描述】:

我创建了某个进程的完整转储,该进程(进程或其转储文件)需要大约 7GB。 该过程是WCF服务。启动时它需要大约 1.4GB 并在一段时间后增长,但从不超过 2-3GB。从来没有,直到今天。现在它几乎占用了所有空闲内存。

在 WinDbg 中运行 !dumpheap -stat 命令时,我得到下一个:

000007fef929ac78    15038      4878720 System.Collections.Hashtable+bucket[]
000007fe9c4d4d20   118818      7604352 BLL.EmailOptOutBLL
000007fef92a0ec0   727949     17470776 System.RuntimeMethodHandle
000007fef9287fe8    10794     17832144 System.Reflection.Emit.__FixupData[]
000007fe9c6dc5c0   907500     36300000 ExactTargetEmail.etAPI.APIProperty
000007fef927f1b8   409602     39034712 System.Object[]
000007fe9c6d9858   302500     41140000 ExactTargetEmail.etAPI.ObjectExtension
000007fef929f058    49141     52089645 System.Byte[]
000007fef929aee0  2487200    152416116 System.String
00000000013a6030      941   1601636252      Free

所有列出的对象的总大小约为 2.3GB

!eeheap -gc 命令列出 4 个堆,总大小为 6.3GB

问题:剩余的 7GB - 2.3GB = 4.7GB?我怎样才能找到它们在哪里(在 WinDbg 或其他工具中)?


!地址-摘要

0:000> !address -summary


Failed to map Heaps (error 80004005)

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free                                    387      7fb`98d72000 (   7.983 Tb)           99.79%
<unclassified>                         1141        4`53c8f000 (  17.309 Gb)  98.28%    0.21%
Image                                  2387        0`11ed5000 ( 286.832 Mb)   1.59%    0.00%
Stack                                   141        0`0168c000 (  22.547 Mb)   0.13%    0.00%
TEB                                      47        0`0005e000 ( 376.000 kb)   0.00%    0.00%
NlsTables                                 1        0`00023000 ( 140.000 kb)   0.00%    0.00%
ActivationContextData                     4        0`00007000 (  28.000 kb)   0.00%    0.00%
CsrSharedMemory                           1        0`00005000 (  20.000 kb)   0.00%    0.00%
PEB                                       1        0`00001000 (   4.000 kb)   0.00%    0.00%

--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_PRIVATE                             671        4`50a59000 (  17.260 Gb)  98.00%    0.21%
MEM_IMAGE                              3014        0`15304000 ( 339.016 Mb)   1.88%    0.00%
MEM_MAPPED                               38        0`01521000 (  21.129 Mb)   0.12%    0.00%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_FREE                                387      7fb`98d72000 (   7.983 Tb)           99.79%
MEM_RESERVE                             799        2`af232000 (  10.737 Gb)  60.96%    0.13%
MEM_COMMIT                             2924        1`b804c000 (   6.875 Gb)  39.04%    0.08%

--- Protect Summary (for commit) - RgnCount ----------- Total Size -------- %ofBusy %ofTotal
PAGE_READWRITE                          897        1`a2017000 (   6.531 Gb)  37.08%    0.08%
PAGE_EXECUTE_READ                       333        0`103c9000 ( 259.785 Mb)   1.44%    0.00%
PAGE_READONLY                           899        0`03940000 (  57.250 Mb)   0.32%    0.00%
PAGE_WRITECOPY                          527        0`01c95000 (  28.582 Mb)   0.16%    0.00%
PAGE_EXECUTE_READWRITE                  132        0`003b9000 (   3.723 Mb)   0.02%    0.00%
PAGE_EXECUTE_WRITECOPY                   88        0`00208000 (   2.031 Mb)   0.01%    0.00%
PAGE_READWRITE|PAGE_GUARD                47        0`000d2000 ( 840.000 kb)   0.00%    0.00%
PAGE_EXECUTE                              1        0`00004000 (  16.000 kb)   0.00%    0.00%

--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
Free                                      5`3fa00000      7f9`5b0e0000 (   7.974 Tb)
<unclassified>                            1`0a3ef000        0`f5611000 (   3.834 Gb)
Image                                   7fe`e7e9a000        0`01338000 (  19.219 Mb)
Stack                                     0`007c0000        0`0007b000 ( 492.000 kb)
TEB                                     7ff`ffe9a000        0`00002000 (   8.000 kb)
NlsTables                               7ff`fffb0000        0`00023000 ( 140.000 kb)
ActivationContextData                     0`00030000        0`00004000 (  16.000 kb)
CsrSharedMemory                           0`7efe0000        0`00005000 (  20.000 kb)
PEB                                     7ff`fffdf000        0`00001000 (   4.000 kb)

!eeheap -gc

0:000> !eeheap -gc
Number of GC Heaps: 4
------------------------------
Heap 0 (00000000013d4ad0)
generation 0 starts at 0x00000001066b2868
generation 1 starts at 0x00000001066984b8
generation 2 starts at 0x00000000ffa01000
ephemeral segment allocation context: none
 segment     begin allocated  size
00000000ffa00000  00000000ffa01000  00000001067ea940  0x6de9940(115251520)
Large object heap starts at 0x00000004ffa01000
 segment     begin allocated  size
00000004ffa00000  00000004ffa01000  0000000509173080  0x9772080(158802048)
Heap Size:               Size: 0x1055b9c0 (274053568) bytes.
------------------------------
Heap 1 (00000000013d9960)
generation 0 starts at 0x0000000203ef0168
generation 1 starts at 0x0000000203d01f78
generation 2 starts at 0x00000001ffa01000
ephemeral segment allocation context: none
 segment     begin allocated  size
00000001ffa00000  00000001ffa01000  000000027c2af408  0x7c8ae408(2089477128)
Large object heap starts at 0x000000050fa01000
 segment     begin allocated  size
000000050fa00000  000000050fa01000  000000050fa01018  0x18(24)
Heap Size:               Size: 0x7c8ae420 (2089477152) bytes.
------------------------------
Heap 2 (0000000001e48f90)
generation 0 starts at 0x000000030552c398
generation 1 starts at 0x00000003054a0920
generation 2 starts at 0x00000002ffa01000
ephemeral segment allocation context: none
 segment     begin allocated  size
00000002ffa00000  00000002ffa01000  0000000374600330  0x74bff330(1958736688)
Large object heap starts at 0x000000051fa01000
 segment     begin allocated  size
000000051fa00000  000000051fa01000  000000051fd87130  0x386130(3694896)
Heap Size:               Size: 0x74f85460 (1962431584) bytes.
------------------------------
Heap 3 (0000000001e4bfa0)
generation 0 starts at 0x00000004059eaa60
generation 1 starts at 0x00000004057d3308
generation 2 starts at 0x00000003ffa01000
ephemeral segment allocation context: none
 segment     begin allocated  size
00000003ffa00000  00000003ffa01000  0000000471912bb8  0x71f11bb8(1911626680)
Large object heap starts at 0x000000052fa01000
 segment     begin allocated  size
000000052fa00000  000000052fa01000  0000000534f2d468  0x552c468(89310312)
Heap Size:               Size: 0x7743e020 (2000936992) bytes.
------------------------------
GC Heap Size:            Size: 0x1791cd260 (6326899296) bytes.

【问题讨论】:

  • !address -summary 将为您提供该过程的概述。向我们展示输出
  • @Kjell Gunnar:在这里。如果我们在谈论这个命令 - 7.9Tb 意味着什么?这不是太字节,对吧?机器没有所有这些内存甚至磁盘
  • 这是进程的空闲虚拟内存。 64位程序可以有8TB的虚拟内存。

标签: memory windbg


【解决方案1】:

如前所述,7.983 Tb 只是可用的虚拟空间 I.E 空间未(尚未)使用。

您的 !address –summary 显示 17 GB ,错误 “Failed to map Heaps”表示原生堆包含在

据我所知,您的 17 GB 包含

a) Native heaps,
b) .NET heaps
c) Areas allocated by VirtualAlloc
d) Memory mapped files

.NET 堆贡献了 6 GB,剩下 11 GB 需要调查。 要检查本机堆,您可以尝试:

!heap –s

但是如果它们很大,尺寸可能不可靠,并且它可能不起作用,因为 !address –summary 无法分类。 你也可以试试:

!address
     BaseAddress      EndAddress+1        RegionSize     Type       State                 Protect             Usage
------------------------------------------------------------------------------------------------------------------------
+        0`00000000        0`00010000        0`00010000             MEM_FREE    PAGE_NOACCESS                         Free       
+        0`00010000        0`00020000        0`00010000 MEM_MAPPED  MEM_COMMIT  PAGE_READWRITE                     Heap       [ID: 1; Handle: 0000000000010000; Type: Segment]
+        0`00020000        0`00021000        0`00001000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE                     <unknown>  

为长输出做好准备(所以重定向到一个文件),在这里你可以看到 您所有的内存区域和映射文件的文件名。

【讨论】:

    【解决方案2】:

    我希望您的转储文件比 7 GB 更接近 17 GB(正如 Kjell 指出的那样)。我不认为你真的想在你的问题中使用 7 GB,但我可能是错的。查看 this article 以了解更多关于 !dumpheap -summary 中显示的总大小的信息。

    相关的是 GC 堆使用 6.2 GB,占已提交内存 (6.875 GB) 的最大份额。这是你最关心的。您的应用程序使用 4 个 GC 堆,其中堆 0 比其他 3 个小一点(~274 MB),后者使用接近 2 GB。如果您的应用没有内存压力,那么花时间进行垃圾收集可能效率不高。

    显示您的 !address 和 !heap -s 输出可能有助于理解为什么要保留 10.737 Gb 内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2011-04-13
      • 2011-09-27
      • 2012-01-25
      相关资源
      最近更新 更多