ubuntu 記憶體占用解析
最近在使用電腦的時候,使用top 命令,發現ubuntu記憶體使用很緊張:
我的電腦是512 mb的記憶體,可以看到使用了467mb 還剩8mb了,但是開啟系統監視器的時候
可以看到兩個記憶體顯示不一樣,到底以哪乙個為準呢?仔細觀察一下,命令列中的cached占用的記憶體161456k
加上系統監視器的306mb,差不多就是現在記憶體使用的情況467mb。
網上查了一下:
用free -m命令檢視
lyh@lyh-desktop:~$ free -m然後第一行那個464是總共使用的記憶體,連cache也算進去了,不用看,第二行290才是真正的占用了。173是空閒的。total used free shared buffers cached
mem: 464 414 49 0 3 120
-/+ buffers/cache: 290 173
swap: 445 23 422
也就是說使用了290mb的記憶體
參見:
linux 記憶體機制
mem:表示物理記憶體統計。
-/+ buffers/cached:表示物理記憶體的快取統計
swap:表示硬碟上交換分割槽的使用情況。只有mem被當前程序實際占用完,即沒有了buffers和cache時,才會使用到swap。
mem 行(第一行)資料說明:
total:1035108kb。表示物理記憶體總大小。
used:1008984kb。表示總計分配給快取(包含buffers 與cache )使用的數量,但其中可能部分快取並未實際使用。
free:26124kb。表示未被分配的記憶體。
shared:0kb。共享記憶體,一般系統不會用到。
buffers:124212kb。系統分配但未被使用的buffers 數量。
cached:413000kb。系統分配但未被使用的cache 數量。
-/+ buffers/cache 行(第二行)資料說明:
used:471772kb,實際使用的buffers 與cache 總量,也是實際使用的記憶體總量。
free: 563336kb, 未被使用的buffers 與cache 和未被分配的記憶體之和,這就是系統當前實際可用記憶體。
根據以上分析,可以得出一下結論:
1. 實際可用記憶體大小:
free(-/+ buffers/cache行)= free(mem)+buffers(mem)+cached(mem);
563336 = 26124 + 124212+ 413000
2. 已經分配的記憶體大小:
used(mem) = used(-/+ buffers/cache)+ buffers(mem) + cached(mem)
1008984kb = 471772 + 124212 +413000
3. 物理記憶體總大小
total(mem)= used(-/+ buffers/cache) + free(-/+ buffers/cache)
1035108 = 471772 + 563336
二. buffer 與cache 的區別
a buffer is something that has yet to be "written" to disk.
a cache is something that has been "read" from the disk and stored for later use.
2.1 cache
cache:快取記憶體,是位於cpu與主記憶體間的一種容量較小但速度很高的儲存器。
由於cpu的速度遠高於主記憶體,cpu直接從記憶體中訪問資料要等待一定時間週期,cache中儲存著cpu剛用過或迴圈使用的一部分資料,當cpu再次使用該部分資料時可從cache中直接呼叫,這樣就減少了cpu的等待時間,提高了系統的效率。
cache又分為一級cache(l1 cache)和二級cache(l2 cache),l1 cache整合在cpu內部,l2 cache早期一般是焊在主機板上,現在也都整合在cpu內部,常見的容量有256kb或512kb l2 cache。
2.2 buffer
buffer:緩衝區,乙個用於儲存速度不同步的裝置或優先順序不同的裝置之間傳輸資料的區域。通過緩衝區,可以使程序之間的相互等待變少,從而使從速度慢的裝置讀入資料時,速度快的裝置的操作程序不發生間斷。
在free命令中顯示的buffer和cache,它們都是占用記憶體:
buffer : 作為buffer cache的記憶體,是塊裝置的讀寫緩衝區,更靠近儲存裝置,或者直接就是disk的緩衝區。
cache: 作為page cache的記憶體, 檔案系統的cache,是memory的緩衝區
如果cache 的值很大,說明cache住的檔案數很多。如果頻繁訪問到的檔案都能被cache住,那麼磁碟的讀io 必會非常小
free命令裡各項記憶體指標說明:
total used free shared buffers cached
mem: 16425996 10727220 5698776 0 380904 9389832
-/+ buffers/cache: 956484 15469512
swap: 8273464 212 8273252
其中第一行用全域性角度描述系統使用的記憶體狀況:
total——總物理記憶體
used——已使用記憶體,一般情況這個值會比較大,因為這個值包括了cache+應用程式使用的記憶體
free——完全未被使用的記憶體
shared——應用程式共享記憶體
buffers——快取,主要用於目錄方面,inode值等(ls大目錄可看到這個值增加)
cached——快取,用於已開啟的檔案
總結:
total=used+free
used=buffers+cached (maybe add shared also)
第二行描述應用程式的記憶體使用:
前個值表示-buffers/cache——應用程式使用的記憶體大小,used減去快取值
後個值表示+buffers/cache——所有可**用程式使用的記憶體大小,free加上快取值
總結:
-buffers/cache=used-buffers-cached
+buffers/cache=free+buffers+cached
第三行表示swap的使用:
used——已使用
free——未使用
什麼是cache memory(快取記憶體):
當你讀寫檔案的時候,linux核心為了提高讀寫效能與速度,會將檔案在記憶體中進行快取,這部分記憶體就是cache memory(快取記憶體)。即使你的程式執行結束後,cache memory也不會自動釋放。這就會導致你在linux系統中程式頻繁讀寫檔案後,你會發現可用物理記憶體會很少。
其實這快取記憶體(cache memory)在你需要使用記憶體的時候會自動釋放,所以你不必擔心沒有記憶體可用。如果你希望手動去釋放cache memory也是有辦法的。
如何釋放cache memory(快取記憶體):
類記憶體占用
類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 是不計算在內的。成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 而我們訪問類的成員函式是通過類裡面的...
PHP陣列實際占用記憶體大小原理解析
一般來說,php陣列的記憶體利用率只有 1 10,也就是說,乙個在c語言裡面100m 記憶體的陣列,在php裡面就要1g。下面我們可以粗略的估算php陣列占用記憶體的大小,首先我們測試1000個元素的整數占用的記憶體 start memory get usage a array for i 0 i ...
ubuntu 空間占用問題
vmware ubuntu虛擬機器,安裝軟體時,報錯顯示記憶體空間不足,虛擬機器配置時設定的是50g,裝的東西不多,但是df lh 檢視後,剩餘空間不到1g,使用du lh 檢視 home ubuntu cache和 home ubuntu 這兩個檔案占用巨大,前者占用1.3g,後者占用29g。su...