【问题标题】:How to understand Memory dump from windbg?如何理解windbg的内存转储?
【发布时间】:2017-04-26 08:46:16
【问题描述】:

我们的一个网站正在使用大约 2gb 的内存,我们正试图了解它为什么使用这么多(因为我们正试图将此网站推向 azure,因为大内存使用意味着从 azure 产生更高的费用)。

我进行了 IIS 转储,从任务管理器中,我可以看到它正在使用 2.2GB 内存。 然后我运行!address -summary,这就是我得到的:

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free                                    913      7fb`2f5ce000 (   7.981 Tb)           99.76%
<unknown>                              4055        4`a49c9000 (  18.572 Gb)  96.43%    0.23%
Heap                                    338        0`1dbd1000 ( 475.816 Mb)   2.41%    0.01%
Image                                  3147        0`0c510000 ( 197.063 Mb)   1.00%    0.00%
Stack                                   184        0`01d40000 (  29.250 Mb)   0.15%    0.00%
Other                                    14        0`001bf000 (   1.746 Mb)   0.01%    0.00%
TEB                                      60        0`00078000 ( 480.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                            2206        4`ba7d2000 (  18.914 Gb)  98.20%    0.23%
MEM_IMAGE                              5522        0`148b0000 ( 328.688 Mb)   1.67%    0.00%
MEM_MAPPED                               71        0`019a0000 (  25.625 Mb)   0.13%    0.00%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_FREE                                913      7fb`2f5ce000 (   7.981 Tb)           99.76%
MEM_RESERVE                            2711        4`378f4000 (  16.868 Gb)  87.58%    0.21%
MEM_COMMIT                             5088        0`9912e000 (   2.392 Gb)  12.42%    0.03%

--- Protect Summary (for commit) - RgnCount ----------- Total Size -------- %ofBusy %ofTotal
PAGE_READWRITE                         1544        0`81afb000 (   2.026 Gb)  10.52%    0.02%
PAGE_EXECUTE_READ                       794        0`0f35d000 ( 243.363 Mb)   1.23%    0.00%
PAGE_READONLY                          2316        0`05ea8000 (  94.656 Mb)   0.48%    0.00%
PAGE_EXECUTE_READWRITE                  279        0`020f4000 (  32.953 Mb)   0.17%    0.00%
PAGE_WRITECOPY                           92        0`0024f000 (   2.309 Mb)   0.01%    0.00%
PAGE_READWRITE|PAGE_GUARD                61        0`000e6000 ( 920.000 kb)   0.00%    0.00%
PAGE_EXECUTE                              2        0`00005000 (  20.000 kb)   0.00%    0.00%

--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
Free                                      5`3fac0000      7f9`59610000 (   7.974 Tb)
<unknown>                                 3`06a59000        0`f9067000 (   3.891 Gb)
Heap                                      0`0f1c0000        0`00fd0000 (  15.813 Mb)
Image                                   7fe`fe767000        0`007ad000 (   7.676 Mb)
Stack                                     0`01080000        0`0007b000 ( 492.000 kb)
Other                                     0`00880000        0`00183000 (   1.512 Mb)
TEB                                     7ff`ffe44000        0`00002000 (   8.000 kb)
PEB                                     7ff`fffdd000        0`00001000 (   4.000 kb)

有很多我没有真正理解的东西:

  1. 网络服务器总共有 8GB 内存,但使用摘要中的 Free 部分显示 7.9Tb?为什么?

  2. Unknown 显示 19.572GB,但网络服务器总共有 8GB 内存。为什么?

  3. 任务管理器显示私有内存 workset 好像是 2.2GB,但如果我将 Heap、Image 和 Stack 加在一起只有 700MB 左右,那么剩下的 1.5GB 内存在哪里,或者我完全读错了输出?

非常感谢

【问题讨论】:

  • 64 位应用程序在 win8 之前有 8TB 的虚拟内存,更高版本为 128TB,这就是为什么你会看到这么大的数字。使用DebugDiag2 Analyzer 分析dmp的内存使用情况,比windbg更容易
  • 谢谢,我现在明白了。 1.5GB 也可以在 manged heap -gc 中找到。

标签: windbg


【解决方案1】:

网络服务器总共有 8GB 内存,但使用摘要中的 Free 部分显示 7.9Tb?为什么?

8 GB RAM 是物理内存,即填充在 PC 的 DDR 插槽中的内存。 8TB是虚拟内存,也可以存放在页面文件中。

32 位进程的虚拟内存可以为 4 GB,具体取决于操作系统对 64 位进程的确切限制。

Unknown 显示 19.572GB,但网络服务器总共有 8GB 内存。为什么?

19 GB 是&lt;unknown&gt; 内存管理器使用的虚拟内存量,例如.NET 或直接调用VirtualAlloc()

即使 19 GB 大于 8 GB,也不一定意味着内存已交换到磁盘。这取决于内存的状态。查看MEM_RESERVE,我们看到其中大部分尚未使用。因此,您的应用程序可能仍然具有良好的性能。

任务管理器显示私有内存工作集大概是 2.2GB,但如果我将 Heap、Image 和 Stack 加在一起只有 700MB 左右,那么剩下的 1.5GB 内存在哪里,或者我完全读错了输出?

其余的在&lt;unknown&gt;,所以总和甚至超过任务管理器显示的2.2 GB。工作集大小表示您的进程使用了​​多少物理 RAM。理想情况下,一切都在 RAM 中,因为 RAM 是最快的。但 RAM 是有限的,并非所有应用程序都适合 RAM。因此,不经常使用的内存被交换到磁盘,这减少了物理 RAM 的使用,从而减小了工作集的大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多