1. 程式人生 > 程式設計 >java 程序是如何在Linux伺服器上進行記憶體分配的

java 程序是如何在Linux伺服器上進行記憶體分配的

眾所周知,Java程序在啟動的時候我們可以通過 -Xms 和-Xmx來設定記憶體的上限和下限。直到我發現使用top命令監控的Java程序在-Xms設定4g的情況下佔用的記憶體並不是4g,這就產生了一個疑問Linux伺服器的記憶體到底是如何進行分配的。

於是乎,我查閱了一些知乎,課程以及Linux相關的書籍。這裡分享並記錄的一下相關的知識。

在Linux上執行的程序不僅限於Java。都有一個概念,邏輯記憶體(Logic Memory),而物理機真是持有的記憶體,我們稱為 實體記憶體(Physic Memory)。

java 程序是如何在Linux伺服器上進行記憶體分配的

程序在開始執行時並不會直接分配實體記憶體,程序只是傻乎乎的以為自己持有了記憶體,也就是邏輯記憶體。當程式執行需要記憶體分配的時候,Linux伺服器會以頁的(Page)至小4k的方式分配,並一對一對映實體記憶體和邏輯記憶體的關係,看到了嗎這裡其實用了代理的思想是得記憶體的分配進行了解耦。

這樣做的好處是什麼呢? 1程序之間相互隔離 2程序自己認為佔有了一段獨立連續的記憶體 3可以申請比實體記憶體更大的記憶體空間。

第三點怎麼理解呢?其實Linux在這裡設計了一種機制叫Swap 就是在程序分配的記憶體空間超過實體記憶體的時候,如果各個程序執行所佔的記憶體真的有這麼多,超過了實體記憶體就會觸發Swap,把不持有CPU的部分程序的記憶體資料和磁碟進行io資料交換。因為CPU一時間不可能超過所有佔有的記憶體,所以這種優化就造就了能多申請一些記憶體,大概是原來記憶體的2-3倍,這就很可觀了,畢竟記憶體是非常貴的。

Swap雖然好,也帶來了一些問題。

比如頻繁的Swap,這會導致記憶體操作轉化為磁碟的的IO操作,拖慢應用程序的執行速度。所以說Swap在我的理解裡屬於可以應急不使程序崩潰,適當使用可以減少成本,過分了不當人的使用就會被反噬的機制。

當然如果太不當人,程序還是會崩潰了,Swap是一個類似Buffer的機制,有大小的。超過設定的上限,Kernel核心就會觸發OOM Killer,殺死一部分程序騰空間。

以上就是java 程序是如何在Linux伺服器上進行記憶體分配的的詳細內容,更多關於java 程序記憶體分配的資料請關注我們其它相關文章!