为什么虚拟内存总是增加,永不减少

时间:2014-01-21 05:25:07

标签: c++ windows-xp virtual-memory

我正在维护一个大系统(非常大),并发现它的内存问题。 该系统是一个带有大量DLL的EXE,用C ++编写,用VS2008构建并在WinXP上运行。

我使用Process Explorer(sysinternals)来观察其内存使用情况。 我发现虚拟内存(VM)和私有字节(PB)之间的差距越来越大。 开始时,VM比PB大一点,然后VM和PB随着运行而快速增加。 在某些时候,PB减少但VM没有减少。 VM可以比PB大300MB。

我发现VM总是增加而PB增加然后减少,最后VM接近2G并且系统崩溃。

在我的系统中,没有直接调用任何虚拟内存分配函数,例如VirtualAlloc / VirtualAllocEx,只需使用new / delete / malloc / free / HeapCreate / HeapAlloc来使用内存。

我使用windbg来调试它,并使用!heap -s来显示进程堆的摘要,并发现这个堆保留了超过300MB的内存,但只提交了15MB。

在这个输出中,我也发现了一些例外,

Virtual address fragmentation   -1340964299% (191 uncommited ranges)
ERROR Cannot read SubSegmentZones list at 79858461

有谁知道VM总是增加的原因?
提前谢谢。

以下是!heap -s 00170000

的部分输出
!heap -s 00170000
Walking the heap 00170000 ...Verbose mode ON.
.......Virtual block: 26740000 - 26740000 (size 00000000)
Virtual block: 267f0000 - 267f0000 (size 00000000)

 0: Heap 00170000
   Flags          00000002 - HEAP_GROWABLE 
   Reserved memory in segments              327680 (k)
   Commited memory in segments              15548 (k)
   Virtual bytes (correction for large UCR) 884 (k)
   Free space                               5818 (k) (320 blocks)
   External fragmentation          37% (320 free blocks)
   Virtual address fragmentation   -1340964299% (191 uncommited ranges)
   Virtual blocks  2 - total 0 KBytes
   Lock contention 4
   Segments        10
   0 hash table for the free list
       Commits 0
       Decommitts 0

   Low fragmentation heap   15a3c9e0
ERROR Cannot read SubSegmentZones list at 79858461
       Metadata usage      3072 bytes
       Statistics:
           Segments created          0
           Segments deleted          0
           Segments reused           0

1 个答案:

答案 0 :(得分:0)

我不确定这是否会有所帮助,但我在Windows XP下运行内存密集型应用程序时遇到了类似的内存问题。我记得问题是内存碎片,这是由许多小的stl容器分配/解除分配引起的。因此,如果您的应用程序正在进行大量的小分配/解除分配,我建议保留内存并重新使用它。