我试图了解我维护的程序的内存使用情况。我已经意识到,从进程转储中,我可以使用windbg进行“堆-a 0”来打印我的进程尚未删除的每个分配。每个分配看起来有点像:

0000000006a905c0:000a0 000a0 [07]-繁忙(68),尾部填充-无法在0000000006a90650处额外读取堆条目

我分配了68,000a0是实际使用的内存量(因为有一些开销)。

如果将所有这些分配加到我的程序中,我将得到34Mb,但是,这似乎与!address -summary中的内存摘要没有什么关系,该内存摘要显示:

0:000> !address -summary

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free                                    132      7ff`e905b000 (   8.000 Tb)          100.00%
<unclassified>                         1234        0`11025000 ( 272.145 Mb)  74.04%    0.00%
Image                                   430        0`03fe6000 (  63.898 Mb)  17.38%    0.00%
Stack                                    93        0`01f00000 (  31.000 Mb)   8.43%    0.00%
TEB                                      31        0`0003e000 ( 248.000 kb)   0.07%    0.00%
NlsTables                                 1        0`00024000 ( 144.000 kb)   0.04%    0.00%
ActivationContextData                    22        0`0001e000 ( 120.000 kb)   0.03%    0.00%
CsrSharedMemory                           1        0`00009000 (  36.000 kb)   0.01%    0.00%
PEB                                       1        0`00001000 (   4.000 kb)   0.00%    0.00%

--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_PRIVATE                            1340        0`1167d000 ( 278.488 Mb)  75.76%    0.00%
MEM_IMAGE                               430        0`03fe6000 (  63.898 Mb)  17.38%    0.00%
MEM_MAPPED                               43        0`01932000 (  25.195 Mb)   6.85%    0.00%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_FREE                                132      7ff`e905b000 (   8.000 Tb)          100.00%
MEM_RESERVE                             631        0`0e970000 ( 233.438 Mb)  63.51%    0.00%
MEM_COMMIT                             1182        0`08625000 ( 134.145 Mb)  36.49%    0.00%

--- Protect Summary (for commit) - RgnCount ----------- Total Size -------- %ofBusy %ofTotal
PAGE_READWRITE                          788        0`04428000 (  68.156 Mb)  18.54%    0.00%
PAGE_EXECUTE_READ                        85        0`027b8000 (  39.719 Mb)  10.81%    0.00%
PAGE_READONLY                           225        0`01984000 (  25.516 Mb)   6.94%    0.00%
PAGE_WRITECOPY                           51        0`00081000 ( 516.000 kb)   0.14%    0.00%
PAGE_READWRITE|PAGE_GUARD                31        0`0003e000 ( 248.000 kb)   0.07%    0.00%
PAGE_EXECUTE_READWRITE                    2        0`00002000 (   8.000 kb)   0.00%    0.00%

--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
Free                                      1`80014000      7fd`cb33c000 (   7.991 Tb)
<unclassified>                            0`0eae9000        0`037d7000 (  55.840 Mb)
Image                                   7ff`7f56e000        0`0062e000 (   6.180 Mb)
Stack                                     0`04120000        0`000fc000 (1008.000 kb)
TEB                                     7ff`fff7c000        0`00002000 (   8.000 kb)
NlsTables                               7ff`fffb0000        0`00024000 ( 144.000 kb)
ActivationContextData                     0`00130000        0`00005000 (  20.000 kb)
CsrSharedMemory                           0`7efe0000        0`00009000 (  36.000 kb)
PEB                                     7ff`fffdf000        0`00001000 (   4.000 kb)

这些数字有点令人困惑,因为似乎只有MEM_PRIVATE和MEM_COMMIT都真正由我的程序分配了……其余的位于共享DLL和其他区域中。让我尝试通过执行以下操作来计算所有MEM_PRIVATE,MEM_COMMIT段:

地址-f:VAR,MEM_PRIVATE,MEM_COMMIT

这给出了每个段而不是每个malloc的输出。这是一个示例:
   0`12bf0000        0`12bf1000        0`00001000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE                     <unclassified>
   0`12cf0000        0`12cf5000        0`00005000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE                     <unclassified>
   0`12e70000        0`12e75000        0`00005000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE                     <unclassified>
   0`37f20000        0`37f21000        0`00001000 MEM_PRIVATE MEM_COMMIT  PAGE_EXECUTE_READWRITE             <unclassified>
   0`7ffe0000        0`7ffe1000        0`00001000 MEM_PRIVATE MEM_COMMIT  PAGE_READONLY                      <unclassified>

第三列是段大小,如果我为程序添加所有这些内容,我将获得总计68Mb(大约是所有分配总数的两倍)。那么我该如何合理化这两个数字呢?是什么决定了这些 segmentation 市场的规模?为什么总金额与我所有的分配差异如此之大?而且,与win7任务管理器(专用工作集)中显示的相比,我所有分配的大小都相当小....那么,我在某处缺少一些内存使用吗?

最佳答案

加总分配不会给您堆使用的总内存“私有(private)内存”。

首先,虚拟内存分配以64KB的粒度完成,堆可能使用更大的块。私有(private)内存还包括所有未与其他进程共享(共享)的内存。这包括随VirtualAlloc分配的内存以及写时复制页面。

关于c++ - 为什么您的进程的私有(private)大小会比分配的数量大得多?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4911089/

10-11 19:41
查看更多