Windows記憶體的一些知識點

來源:互聯網
上載者:User

之前, 我曾經寫過一篇文章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

http://channel9.msdn.com/Events/TechEd/Europe/2010/WCL401

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.