這個問題的簡單答案是這些值中沒有一個是一個可執行文件實際使用多少內存的可靠指標,也沒有一個是真正適合調試內存泄漏的值。
二等兵拜特斯引用進程可執行文件的內存量。索要-不一定是數額實際使用..它們是“私有”的,因為它們(通常)排除內存映射文件(即共享DLL)。但是-這是個陷阱-它們不一定排除記憶由這些文件分配..無法判斷私有字節的更改是由于可執行文件本身還是鏈接庫造成的。私有字節也是不完全是物理內存;可以將它們分頁到磁盤或備用頁列表中(即不再使用,但也不分頁)。
工作裝置指的是總數物理進程使用的內存(RAM)。然而,與私有字節不同的是,它還包括內存映射文件和各種其他資源,因此它比私有字節更不準確。這個值與TaskManager的“MEM使用”中報告的值相同,并且是近年來造成無數混亂的根源。工作集中的內存是“物理的”,也就是說它可以在沒有頁面錯誤的情況下被處理;但是,備用頁列表是也物理上仍然在內存中,但在工作集中沒有報告,這就是為什么當您最小化應用程序時,可能會看到“MEM使用量”突然下降。
虛擬字節是總數嗎?虛擬地址空間被整個過程所占據。這與工作集類似,因為它包含內存映射文件(共享DLL),但它也包括待機列表中的數據和已被分頁并位于磁盤某處的分頁文件中的數據。在重載下,每個進程在系統上使用的總虛擬字節加起來將大大超過機器實際擁有的內存。
所以關系是:
- 私有字節是您的應用程序實際分配的,但包括分頁文件的使用;
- 工作集是非分頁的私有字節加上內存映射的文件;
- 虛擬字節是工作集加上分頁的私有字節和備用列表。
這里還有另一個問題:就像共享庫可以在應用程序模塊內分配內存一樣,導致在應用程序的私有字節中報告的潛在錯誤,你的應用程序也可能最終在共享模塊,導致錯誤負片..這意味著您的應用程序實際上有可能發生內存泄漏,而這種泄漏根本不會在私有字節中顯示。不太可能,但有可能。
二等兵拜特斯是個合理的人近似您的可執行文件正在使用并可用于幫助的內存量。縮小范圍內存泄漏的潛在候選列表;如果您看到數量不斷地不斷增加,您將希望檢查該進程是否存在泄漏。但是,這不可能,證明是否有漏洞。
在Windows中檢測/糾正內存泄漏的最有效工具之一實際上是VisualStudio(鏈接指向使用VS進行內存泄漏的頁面,而不是產品頁)。理性凈化是另一種可能性。微軟也有一個更通用的最佳做法文件在這個問題上。下面列出了更多的工具前一個問題.
我希望這能澄清一些事情!跟蹤內存泄漏是調試過程中最困難的工作之一。祝好運。