我正在维护一个大系统(非常大),并发现它的内存问题。 该系统是一个带有大量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
答案 0 :(得分:0)
我不确定这是否会有所帮助,但我在Windows XP下运行内存密集型应用程序时遇到了类似的内存问题。我记得问题是内存碎片,这是由许多小的stl容器分配/解除分配引起的。因此,如果您的应用程序正在进行大量的小分配/解除分配,我建议保留内存并重新使用它。