配置tomcat服務器內存大小中的Xms、Xmx、PermSize、MaxPermSize 詳解


 

JVM按照其存儲數據的內容將所需內存分配為堆區與非堆區兩個部分:

所謂堆區即為通過new的方式創建的對象(類實例)所占用的內存空間, 堆是運行時數據區域;

非堆區即為代碼、常量、外部訪問(如文件訪問流所占資源)等。

配置堆區的(-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn)

配置非堆區(-XX:PermSize、-XX:MaxPermSize)

一. 堆區配置參數:

    1、-Xms :表示java虛擬機堆區內存初始內存分配的大小,虛擬機在啟動時向系統申請的內存的大小

  2、-Xmx: 表示java虛擬機堆區內存可被分配的最大上限,通常為操作系統可用內存的1/4大小。但是開發過程中,通常會將 -Xms 與 -Xmx兩個參數的配置相同的值,其目的是為了能夠在java垃圾回收機制清理完堆區后不需要重新分隔計算堆區的大小而浪費資源。

 

如果虛擬機啟動時設置使用的內存比較小而在這種情況下有許多對象進行初始化,虛擬機就必須重復地增加內存來滿足使用。默認空余堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大於70%時,JVM會減少堆直到-Xms的最小限制。因此服務器一般設置-Xms、-Xmx 相等以避免在每次GC 后調整堆的大小。而堆的最大值受限於系統使用的物理內存。一般使用數據量較大的應用程序會使用持久對象,內存使用有可能迅速地增長。當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,並且導致應用服務崩潰。因此一般建議堆的最大值設置為可用內存的最大值的80%

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

 

    -XX:newSize、-XX:MaxnewSize、-Xmn:新生代、中生代、老生代。java中每新new一個對象所占用的內存空間就是新生代的空間,當java垃圾回收機制對堆區進行資源回收后,那些新生代中沒有被回收的資源將被轉移到中生代,中生代的被轉移到老生代。

    1、-XX:newSize:表示新生代初始內存的大小,應該小於 -Xms的值;

    2、-XX:MaxnewSize:表示新生代可被分配的內存的最大上限;當然這個值應該小於 -Xmx的值;

    3、-Xmn:至於這個參數則是對 -XX:newSize、-XX:MaxnewSize兩個參數的同時配置,也就是說如果通過-Xmn來配置新生代的內存大小,那么-XX:newSize = -XX:MaxnewSize = -Xmn,雖然會很方便,但需要注意的是這個參數是在JDK1.4版本以后才使用的。

 

二. 非堆區內存配置的兩個參數:

    1、-XX:PermSize:表示非堆區初始內存分配大小,其縮寫為permanent size(持久化內存)

    2、-XX:MaxPermSize:表示對非堆區分配的內存的最大上限。

這里面非常要注意的一點是:在配置之前一定要慎重的考慮一下自身軟件所需要的非堆區內存大小,因為此處內存是不會被java垃圾回收機制進行處理的地方。並且更加要注意的是 最大堆內存與最大非堆內存的和絕對不能夠超出操作系統的可用內存

 

XX:MaxPermSize設置過小會導致java.lang.OutOfMemoryError: PermGen space 就是內存益出。

說說為什么會內存益出:

(1)這一部分內存用於存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不同。

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

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


免責聲明!

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



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