Windows記憶體的一些知識點

2021-09-06 06:06:30 字數 2292 閱讀 6318

之前, 我曾經寫過一篇文章task manager跟performance monitor的區別(working set和private bytes), 對windows記憶體的解釋並不是很清楚.

最近從頭到尾聽了一遍mark russinovich的windows記憶體的講座, 於是把筆記記錄在這裡.

記憶體基礎

記憶體位址分為三部分:

free

在performance monitor中, 有如下的counters.

對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所申請的共享記憶體.

什麼是working set?

程序啟動的時候總是從乙個空的working set開始的.

之後該程序在試圖訪問記憶體頁面的時候, 會發生page fault, 因為這個page不在working set裡.

在記憶體充足的時候, process working set代表著所有該程序引用過的記憶體(還沒有釋放的).

在記憶體不足的時候, working set會被壓縮.

當memory manager覺得該程序足夠大了, 那麼這個程序的某些記憶體頁面會被拋棄, 為新頁面騰出空間. 拋棄頁面的演算法類似」佇列先進先出」加」最後訪問的最後淘汰」.

working set包含兩類page

performance counter有如下三個counter來顯示這些資訊.

一些要點, working set在記憶體不足時是會被trim掉的, 所以這有時並不能反應該程序的記憶體飢渴程度.

檢查記憶體問題的可靠的資料**

process explorer中的virtual size, private bytes, working set.

舉例, sysinternal上有個叫做testlimit的tool, 專門用來測試記憶體的.

測試命令如下:

· testlimit -r 1024 -c 1

· testlimit -m 1024 –c 1

· testlimit –d 1024 –c 1

task manager中可以看到如下的資訊. 可以看出並不能良好區分這三者.

在process explorer中可以看到下面的資訊.

資料**

mysteries of windows memory management revealed with mark russinovich, part 2

mysteries of windows memory management revealed with mark russinovich, part 1

一些知識點

字串拼接 1.a join b a為元素之間的分隔符,b為待分割的序列 可用於輸出時的資料處理,元素間有空格,末尾沒有 2 s s s str1,str2,str3 前半部分為字串,後半部分為索引。用於引入,s是物件 3.format str1,str2,str3 與f 括號裡為已有變數 關於for...

一些知識點

1.vector是在堆上還是棧上?在堆上.2.我們發現指標有一些 似是而非 的特徵 1 指標消亡了,並不表示它所指的記憶體會被自動釋放。比如函式中的指標是區域性變數,如果它指向了堆上,而自己出了函式後消亡了,但它所指向的記憶體還是存在的,導致了記憶體洩漏.2 記憶體被釋放了,並不表示指標會消亡或者成...

一些知識點

1 sln 解決方案檔案 csproj 專案檔案 cs 原始檔 解決方案包含多個專案,每個專案都是乙個程式。config 配置檔案 3 const int a 1 const 定義乙個量為常量,運算中用到當常量使用,不可以再重新賦值。4 型別轉換。1 隱式轉換。從值型別轉換成引用型別。從引用型別轉換...