Windows內存的一些知識點


之前, 我曾經寫過一篇文章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中可以看到如下的一些項目.

clip_image001

其中, 默認的列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的工具.

clip_image002

圖中的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, 專門用來測試內存的.

clip_image003

測試命令如下:

· 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中可以看到如下的信息. 可以看出並不能良好區分這三者.

clip_image004

在Process Explorer中可以看到下面的信息.

clip_image005

 

資料來源

==================

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM