之前, 我曾經寫過一篇文章Task Manager跟Performance Monitor的區別(Working set和Private bytes), 對Windows記憶體的解釋並不是很清楚.
最近從頭到尾聽了一遍Mark Russinovich的Windows記憶體的講座, 於是把筆記記錄在這裡.
記憶體基礎
===========================
記憶體位址分為三部分:
- Private – 舉例: 進程堆
- Shareable – 舉例: EXE, DLL, Shared Memory, Other memory mapped files
- Free
在Performance Monitor中, 有如下的counters.
- Private Bytes – 為Committed private memory
- Virtual Bytes – 為total of Shareable + Private (including reserved)
對Shareable或者Reserved, 或者Free的記憶體是沒有單獨的counter的.
Committed和Reserved的區別是什麼呢?
============================
比方說, 我們需要八個人一起吃飯, 但是這個八個人不能同時到達飯店. 所以, 我們需要訂一個八人的桌子. 訂的八人桌就是reserved, 但是先到並坐下的人就是committed的了.
進程中的Stack就是這種概念的典型應用, 調用棧必須連續, 但是卻不是一次性佔滿的, 隨著程式調用的深入, Reserve了的棧的空間會一點點的被commit.
Take Manager
============================
Task Manager中可以看到如下的一些項目.
其中, 預設的列Memory –Private Working Set跟virtual memory毫無關係, 由於下面也說到的working set trimming, 這個column也不能反映該進程對整個系統的記憶體造成的影響, 實際上沒啥用.
其中, Memory-Commit Size跟Private Byte是相等的. 在Vista之前, 這個column叫做VM Size. Vista及之後它叫做Commit Size.
絕大多數的記憶體問題都已由於進程泄露了Private Committed memory引起的, 比如說Heap, GC heap.
但private byte這個counter並不會透露全部的記憶體資訊, 比如說對於記憶體片段, 或僅由本進程載入的DLL所申請的共用記憶體.
想查看更多記憶體資訊, 可以通過Sysinternal的一個叫做VMMap的工具.
圖中的Image, Mapped File, Shareable是可以與其他進程共用的. 下面的都是private的.
什麼是Working Set?
=====================
進程啟動的時候總是從一個空的working set開始的.
之後該進程在試圖訪問記憶體頁面的時候, 會發生page fault, 因為這個page不在working set裡.
在記憶體充足的時候, process working set代表著所有該進程引用過的記憶體(還沒有釋放的).
在記憶體不足的時候, working set會被壓縮.
當Memory manager覺得該進程足夠大了, 那麼這個進程的某些記憶體頁面會被拋棄, 為新頁面騰出空間. 拋棄頁面的演算法類似”隊列先進先出”加”最後訪問的最後淘汰”.
Working Set包含兩類page
Performance Counter有如下三個counter來顯示這些資訊.
- Working Set Shareable
- Working Set Private
- Working Set Size (上面二者之和)
一些要點, Working Set在記憶體不足時是會被trim掉的, 所以這有時並不能反應該進程的記憶體饑渴程度.
檢查記憶體問題的可靠的資料來源
===================
Process Explorer中的Virtual Size, Private Bytes, Working Set.
舉例, Sysinternal上有個叫做TestLimit的tool, 專門用來測試記憶體的.
測試命令如下:
· TestLimit -r 1024 -c 1
· TestLimit -m 1024 –c 1
- o Commit 1G 記憶體, 但不訪問這些記憶體.
· TestLimit –d 1024 –c 1
- o Commit 1G記憶體, 而且訪問這些記憶體.
Task manager中可以看到如下的資訊. 可以看出並不能良好區分這三者.
在Process Explorer中可以看到下面的資訊.
資料來源
==================
Mysteries of Windows Memory Management Revealed with Mark Russinovich, Part 2
http://channel9.msdn.com/Events/TechEd/Europe/2010/WCL402
Mysteries of Windows Memory Management Revealed with Mark Russinovich, Part 1
http://channel9.msdn.com/Events/TechEd/Europe/2010/WCL401