如何理解Linux內存一直被大量占用


最近有個月經問題,老有人問為何開機后,還沒有其他服務,mem就被用完了?是不是內存泄露?是否要重啟服務?只能說不要看現象,要看本質才能找到問題的根源。
往往給出這樣的結果,懷疑內存用了90%:
Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached

這樣懷疑很普遍,因為很多人用慣了Windows。Windows下,可以使用任務管理器查看當前進程對於內存的消耗情況。在我看來,Windows物理內存總是留下一定的空間,就算此時物理內存有空閑時,也會讓某些程序去使用虛擬內存,目的是在Windows下啟動新程序時,直接分配空閑的物理內存,這樣子新程序啟動速度就較快,而Linux則不然。

而在Linux下,使用top命令看到內存占用情況:

Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached

這里的結果顯示使用了3.8G的used,占用率達到90%。看看free的結果你還可以對比一下:
$ free -m
total used free shared buffers cached
Mem: 4049 3784 265 0 208 2939
-/+ buffers/cache: 636 3413
Swap: 2588 0 2588

雖然MEM顯示了3.7G左右的used,但是(-/+ buffers/cache)減去buffers和cache的結果可以看到,當前進程實際占用內存是636M,而可用空閑(free)內存為3.4G。

可以這么理解:在linux的內存分配機制中,優先使用物理內存,當物理內存還有空閑時(還夠用),不會釋放其占用內存,就算占用內存的程序已經被關閉了,該程序所占用的內存用來做緩存使用,對於開啟過的程序、或是讀取剛存取過得數據會比較快。

如上面的例子:使用了4G的內存,3.7G被占用,但是buuffer和cached部分作為緩存,可以使用命中率的方式提高使用效率,而且這部分緩存是根據指令隨時可以釋放的,我們可以認為這部分內存沒有實際被使用,也可以認為它是空閑的。

因此查看目前進程正在實際被使用的內存,是used-(buffers+cache),也可以認為如果swap沒有大量使用,mem還是夠用的,只有mem被當前進程實際占用完(沒有了buffers和cache),才會使用到swap的。

 

注:

Linux中Swap(即:交換分區),類似於Windows的虛擬內存,就是當內存不足的時候,把一部分硬盤空間虛擬成內存使用,從而解決內存容量不足的情況。Android是基於Linux的操作系統,所以也可以使用Swap分區來提升系統運行效率[1]  
交換分區,英文的說法是swap,意思是“交換”、“實物交易”。它的功能就是在內存不夠的情況下,操作系統先把內存中暫時不用的數據,存到硬盤的交換空間,騰出內存來讓別的程序運行,和Windows的虛擬內存(pagefile.sys)的作用是一樣的。

 

轉自: http://blog.licess.com/linux-memory/


免責聲明!

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



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