Java JVM虛擬機器選項 Xms Xmx PermSize MaxPermSize 的區別

來源:互聯網
上載者:User

Eclipse崩潰,錯誤提示:

MyEclipse has detected that less than 5% of the 64MB of Perm

Gen (Non-heap memory) space remains. It is strongly recommended

that you exit and restart MyEclipse with new virtual machine memory

paramters to increase this memory.  Failure to do so can result in

data loss. The recommended Eclipse memory parameters are:

eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

1.參數的含義

-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

-vmargs 說明後面是VM的參數,所以後面的其實都是JVM的參數了

-Xms128m JVM初始分配的堆記憶體

-Xmx512m JVM最大允許分配的堆記憶體,按需分配

-XX:PermSize=64M JVM初始分配的非堆記憶體

-XX:MaxPermSize=128M JVM最大允許分配的非堆記憶體,按需分配

我們首先瞭解一下JVM記憶體管理的機制,然後再解釋每個參數代表的含義。

1)堆(Heap)和非堆(Non-heap)記憶體

按照官方的說法:“JAVA 虛擬機器具有一個堆,堆是運行時資料區域,所有類執行個體和數組的記憶體均從此處分配。堆是在 JAVA 虛擬機器啟動時建立的。”“在JVM中堆之外的記憶體稱為非堆記憶體(Non-heap memory)”。

可以看出JVM主要管理兩種類型的記憶體:堆和非堆。簡單來說堆就是Java代碼可及的記憶體,是留給開發人員使用的;非堆就是JVM留給自己用的,所以方法區、JVM內部處理或最佳化所需的記憶體(如JIT編譯後的代碼緩衝)、每個類結構(如運行時常數池、欄位和方法資料)以及方法和構造方法的代碼都在非堆記憶體中。

堆記憶體配置

JVM初始分配的堆記憶體由-Xms指定,預設是實體記憶體的1/64;JVM最大分配的堆記憶體由-Xmx指定,預設是實體記憶體的1/4。預設空餘堆記憶體小於40%時,JVM就會增大堆直到-Xmx的最大限制;

空餘堆記憶體大於70%時,JVM會減少堆直到-Xms的最小限制。因此伺服器一般設定-Xms、-Xmx 相等以避免在每次GC 後調整堆的大小。

說明:如果-Xmx 不指定或者指定偏小,應用可能會導致java.lang.OutOfMemory錯誤,此錯誤來自JVM,不是Throwable的,無法用try...catch捕捉。

非堆記憶體配置

JVM使用-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64;由XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4。(還有一說:MaxPermSize預設值和-server -client選項相關,

-server選項下預設MaxPermSize為64m,-client選項下預設MaxPermSize為32m。這個我沒有實驗。)

上面錯誤資訊中的PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存地區。還沒有弄明白PermGen space是屬於非堆記憶體,還是就是非堆記憶體,但至少是屬於了。

XX:MaxPermSize設定過小會導致java.lang.OutOfMemoryError: PermGen space 就是記憶體益出。 PermSize和MaxPermSize指明虛擬機器為java永久產生對象(Permanate generation)如,class對象、方法對象這些可反射(reflective)對象分配記憶體限制,這些記憶體不包括在Heap(堆記憶體)區之中。

說說為什麼會記憶體益出:

(1)這一部分記憶體用於存放Class和Meta的資訊,Class在被 Load的時候被放入PermGen space地區,它和存放Instance的Heap地區不同。

(2)GC(Garbage Collection)不會在主程式運行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS 的話,就很可能出現PermGen space錯誤。

這種錯誤常見在web伺服器對JSP進行pre compile的時候。

  • 1
  • 2
  • 下一頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.