2010-06-12 29 views
14

我的應用程序運行了幾個小時,沒有增加任何值(vmsize,內存)的任務管理器。但幾個小時後,我發現內存不足錯誤。什麼是sysinternals進程管理器中的「虛擬大小」

在sysinternals我看到「虛擬大小」不斷增加,當它達到2 GB左右時,我開始出現內存錯誤。

那麼是什麼樣的內存泄漏? 我如何用代碼演示它?是否有可能用任何代碼片段重現同樣的事情,其中​​沒有一個內存值增加,但只有sysinternsl進程管理器中的虛擬大小增加了?

感謝您的任何建議

+0

該問題應該有一個Windows標記。我很想從Linux pov迴應;) – Dummy00001 2010-06-12 22:12:16

回答

4

從事物的聲音,你運行的地址空間。 32位Windows將地址空間分成一半,一半用於用戶程序,另一半用於系統,因此每個都可以獲得2千兆字節。

這最常見的原因是將內存空間分割爲無法找到足夠大的分區塊。不幸的是,在不瞭解更多關於你在做什麼的情況下,很難猜出爲什麼會發生這種情況。

8

虛擬大小是進程分配的頁數,那些當前不在工作集中的物理頁(加載到RAM中的 )將位於系統的頁面文件中。

通常情況下,您會分配未釋放的內存。例如,如果沒有像Rational Purify或Boundschecker這樣的特殊工具,這可能很難在代碼中找到。使用sysinternals,您會發現必須有泄漏,但它絕不會告訴您在哪裏...

如果您的軟件不是那麼大,您可以嘗試註銷「新建」和「刪除」並查看如果通過管理分配的對象列表(如果你自己的內存調試器這麼說),那麼內存中的對象太多。在Windows世界中有一些助手,如CRT memory checking utils from Microsoft。在某些情況下它們很有用。

2

根據this thread上的Sysinternals論壇,虛擬大小對應於進程的地址空間(我猜的內存COMMITED和保留頁)

1

看來,虛擬大小包括分配有以下類型的網頁: MEM_MAPPED(數據視圖) MEM_IMAGE(可執行圖像視圖) MEM_PRIVATE(通常分配的頁面內存)

這不是唯一的「記憶」的數據,而且還包括頁面空間的* .dll-S和文件映射機制。