之前, 我曾經寫過一篇文章Task Manager跟Performance Monitor的區別(Working set和Private bytes), 對Windows內存的解釋並不是很清楚.
最近從頭到尾聽了一遍Mark Russinovich的Windows內存的講座, 於是把筆記記錄在這里.
內存基礎
===========================
內存地址分為三部分:
- Private – 舉例: 進程堆
- Reserved 或 Committed
- Shareable – 舉例: EXE, DLL, Shared Memory, Other memory mapped files
- Reserved 或 Committed
- 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
- Shareable
- Private
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
- o Reserve 1G內存
· 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