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