[debugging] 什麼是專用字節,虛擬字節,工作集?



Answers

您不應該嘗試使用perfmon,任務管理器或類似的工具來確定內存洩漏。 它們對於識別趨勢很有幫助,但不是其他的。 他們以絕對值形式報告的數字過於模糊,並且對於特定任務(如內存洩漏檢測)非常有用。

以前對這個問題的回答給出了各種類型的很好的解釋。

你問一個工具推薦:我推薦Memory Validator。 能夠監視數十億內存分配的應用程序。

http://www.softwareverify.com/cpp/memory/index.html

免責聲明:我設計了Memory Validator。

Question

我正在嘗試使用perfmon windows實用程序來調試進程中的內存洩漏。

這就是perfmon解釋術語的方式:

工作集是此進程的工作集的當前大小(以字節為單位)。 工作集是進程中線程最近觸及的一組內存頁面。 如果計算機中的可用內存超過閾值,即使它們未被使用,頁面也會留在進程的工作集中。 當可用內存低於閾值時,頁面將從工作集中刪除。 如果需要他們,他們將在離開主存之前被軟件故障重新放回工作集。

虛擬字節是進程正在使用的虛擬地址空間的當前大小(以字節為單位)。 使用虛擬地址空間不一定意味著相應使用磁盤或主內存頁面。 虛擬空間是有限的,並且該過程可能會限制其加載庫的能力。

專用字節是當前大小(以字節為單位)該進程分配的內存不能與其他進程共享的內存。

這些是我有的問題:

是我應該測量的私人字節,以確定該進程是否有任何洩漏,因為它不涉及任何共享庫,並且如果發生任何洩漏,將來自該進程本身?

該進程消耗的內存總量是多少? 它是虛擬字節還是虛擬字節和工作集的總和?

私人字節,工作集和虛擬字節之間是否有任何關係?

有沒有其他工具可以更好地了解內存使用情況?




perfmon計數器的定義自一開始就被打破,並且出於某種原因似乎太難以糾正。

有關Windows內存管理的完整概述,請參見MSDN上的視頻“ 內存管理之謎 ”:它涵蓋了比追踪內存洩漏所需的更多主題(例如工作集管理),但在相關主題中提供了足夠的詳細信息。

為了給你提供perfmon計數器描述的問題,下面是關於MSDN上“ 專用字節性能計數器 - 小心! ”私有字節的內幕:

問:什麼時候私人字節不是私人字節?

答:當它不是常駐的時候。

Private Bytes計數器報告進程的提交費用。 也就是說,交換文件中分配的空間量足以保存私有內存的內容。 注意:由於可能與未提交的保留狀態下的虛擬內存混淆,因此我避免使用“保留”一詞。

從MSDN上的“ 性能規劃

3.3私人字節

3.3.1說明

專用內存,被定義為為其他進程無法共享的進程分配的內存。 當在一台機器上執行多個此類進程時,此內存比共享內存更昂貴。 (傳統)非託管dll中的私有內存通常由C ++靜態構成,佔dll總工作集的5%。




Related