歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Java JVM虛擬機選項 Xms Xmx PermSize MaxPermSize 的區別

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

日期:2017/2/28 14:50:11   编辑:Linux教程

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的時候。

Copyright © Linux教程網 All Rights Reserved