linux運行中的程序占用內(nèi)存

在linux下,查看一個運行中的程序, 占用了多少內(nèi)存, 一般的命令有
  • ps aux
    其中 VSZ(或VSS)列 表示,程序占用了多少虛擬內(nèi)存。
    RSS列 表示, 程序占用了多少物理內(nèi)存。
    虛擬內(nèi)存可以不用考慮,它并不占用實際物理內(nèi)存。
  • top 命令
    其中 VIRT(或VSS)列 表示,程序占用了多少虛擬內(nèi)存。 同 ps aux 中的 VSZ列。RES列 表示, 程序占用了多少物理內(nèi)存。同 ps aux 中的RSS列
在linux下, 查看當前系統(tǒng)占用了多少內(nèi)存, 一般的命令是 free

???其中, free就是系統(tǒng)還有多少內(nèi)存可以使用。
???但由于 linux 系統(tǒng)對內(nèi)存使用有一個原則, 就是, 內(nèi)存是寶貴的, 能使用多少就使用多少。 所以, linux會把已經(jīng)調(diào)用過的包緩存起來,放在內(nèi)存里。
這樣,實際上,可以使用的內(nèi)存,就可以理解為, free+buffers+cached

一個奇怪的現(xiàn)象

???當你了解完這些命令以后, 再去使用ps aux 命令去查看的時候, 會發(fā)現(xiàn)一個奇怪的現(xiàn)象:所有的 RSS 列的數(shù)據(jù),加起來, 比物理內(nèi)存的數(shù)要大很多。
???比如, 物理內(nèi)存為2G, 而RSS列的數(shù)據(jù)加起來,可能有5個G之多, 這是怎么回事了?這是因為RSS列的值騙了我們。

linux的內(nèi)存機制是這樣的:
在運行一個程序時, linux會調(diào)用該程序依賴的鏈接庫, 如lib.xx.so。 首先看該鏈接庫是否被映射進內(nèi)存中,如果沒有被映射,則將代碼段與數(shù)據(jù)段映射到內(nèi)存中,否則只是將其加入進程的地址空間。

???這樣,當N個程序,依賴到lib.xx.so的時候, 實際上,內(nèi)存中只有一個lib.xx.so ,而不是N個。 而RSS在顯示一個程序占用的實際物理內(nèi)存時, 將lib.xx.so也算了進來。
???比如, X程序, 本身占用內(nèi)存為5M, lib.xx.so 占用內(nèi)存2M,lib.xx.so被N個程序共享依賴。 則RSS顯示為,X程序運行,占用內(nèi)存為7M。 實際上, X程序占用了5M空間。 多余的2m被討入到RSS中了。
???當你在用ps aux顯示內(nèi)存占用情況時, N個共享依賴lib.xx.so的N個程序,都把這2m空間,算在自己的RSS中了, 這樣RSS的sum值,就比實際物理內(nèi)存多了。
???當然, linux的內(nèi)存使用機制很復雜, 不是一句兩句能說清楚的。這里只是簡單的說明了一下, ps aux中的RSS值, 并不能真實反映物理內(nèi)存的使用情況。

參考資料
1. http://blog.csdn.net/cherish_2012/article/details/41979679
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容