JAVA -Xms -Xmx -XX:PermSize -XX:MaxPermSize 區別

java  -Xms -Xmx -XX:PermSize -XX:MaxPermSize


    在作java開發時尤爲是大型軟件開發時常常會遇到內存溢出的問題,好比說OutOfMemoryError等。這是個讓開發人員很痛苦、也很糾結的問題,由於咱們有時不知道什麼樣的操做致使了這種問題的發生。因此咱們不得不經過不斷的優化本身的代碼結構,重構了一次又一次。雖說不斷的重構本身的代碼對公對私都是一件很是好的事,可是有時咱們會發現有些時候不僅僅是經過重構自身的代碼就可以解決這樣的問題,由於也多是因爲咱們對java虛擬機運行時的內存分配的不得當致使了內存溢出現象的不斷髮生。爲了解決這一問題,java開發團隊提供了一個用戶自定義的方式按需配置java虛擬機運行時的所需的內存——經過參數配置的形式實現參數分配自定義化。

    在解析如何經過參數來配置JVM運行時內存分配以前,要說明一下JVM運行時內存的格局。

JVM按照其存儲數據的內容將所需內存分配爲堆區與非堆區兩個部分:所謂堆區即爲經過new的方式建立的對象(類實例)所佔用的內存空間;非堆區即爲代碼、常量、外部訪問(如文件訪問流所佔資源)等。然而雖然java的垃圾回收機制雖然可以很好的解決內存浪費的問題,可是這種機制也僅僅的是回收堆區的資源,而對於非堆區的資源就一籌莫展了,針對這樣的資源回收只能憑藉開發人員自身的約束來解決。就算是這樣(堆區有java回收機制、非堆區開發人員可以很好的解決),當運行時所需內存瞬間激增的時候JVM無奈的也要停止程序的運行。因此本文講述的是如何解決後者的問題。
好了,說了這麼可能是時候講一下配置JVM內存的幾種參數及其如何使用了。
首先,常見參數種類(配置內存):(-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn)、(-XX:PermSize、-XX:MaxPermSize)。能夠從列舉的方式上看出個人用意,參數的配置是分組的,前者是用來配置堆區的,後者是用來配置非堆區的。
    第一組配置參數:-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn
    
    一、-Xms :表示java虛擬機堆區內存初始內存分配的大小,一般爲操做系統可用內存的1/64大小便可,但仍需按照實際狀況進行分配。有可能真的按照這樣的一個規則分配時,設計出的軟件尚未可以運行得起來就掛了。
    二、-Xmx: 表示java虛擬機堆區內存可被分配的最大上限,一般爲操做系統可用內存的1/4大小。可是開發過程當中,一般會將 -Xms 與 -Xmx兩個參數的配置相同的值,其目的是爲了可以在java垃圾回收機制清理完堆區後不須要從新分隔計算堆區的大小而浪費資源。

    通常來說對於堆區的內存分配只須要對上述兩個參數進行合理配置便可,可是若是想要進行更加精細的分配還能夠對堆區內存進一步的細化,那就要用到下面的三個參數了-XX:newSize、-XX:MaxnewSize、-Xmn。固然這源於對堆區的進一步細化分:新生代、中生代、老生代。java中每新new一個對象所佔用的內存空間就是新生代的空間,當java垃圾回收機制對堆區進行資源回收後,那些新生代中沒有被回收的資源將被轉移到中生代,中生代的被轉移到老生代。而接下來要講述的三個參數是用來控制新生代內存大小的。
 
    一、-XX:newSize:表示新生代初始內存的大小,應該小於 -Xms的值;
    二、-XX:MaxnewSize:表示新生代可被分配的內存的最大上限;固然這個值應該小於 -Xmx的值;
    三、-Xmn:至於這個參數則是對 -XX:newSize、-XX:MaxnewSize兩個參數的同時配置,也就是說若是經過-Xmn來配置新生代的內存大小,那麼-XX:newSize = -XX:MaxnewSize = -Xmn,雖然會很方便,但須要注意的是這個參數是在JDK1.4版本之後才使用的。

    上面所述即爲java虛擬機對外提供的可配置堆區的參數,接下來說述java虛擬機對非堆區內存配置的兩個參數:
    
    一、-XX:PermSize:表示非堆區初始內存分配大小,其縮寫爲permanent size(持久化內存)
    二、-XX:MaxPermSize:表示對非堆區分配的內存的最大上限。
    
    這裏面很是要注意的一點是:在配置以前必定要慎重的考慮一下自身軟件所須要的非堆區內存大小,由於此處內存是不會被java垃圾回收機制進行處理的地方。而且更加要注意的是 最大堆內存與最大非堆內存的和絕對不可以超出操做系統的可用內存。

自動關閉的緣由多是eclipse目錄下eclipse.ini文件的設置上有問題,通常的ini文件設置主要包括如下幾項:
-vmargs
-Xms40m
-Xmx256m
-XX:PermSize=64M
-XX:MaxPermSize=128M
如下解釋其意思。
-vmargs:說明後面是VM的參數
-Xms40m:虛擬機佔用系統的最小內存
-Xmx256m:虛擬機佔用系統的最大內存
-XX:PermSize:最小堆大小。通常報內存不足時,都是說這個過小,
                       堆空間剩餘小於5%就會警告,建議把這個稍微設
                               大一點,不過要視本身機器內存大小來設置
-XX:MaxPermSize:最大堆大小。這個也適當大些
     因此若出現問題,首先請調整 -Xms40m:將其設置的小一些,就ok了,1g內存推薦設置爲:
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=256M
-XX:MaxPermSize=512M
其中-XX:PermSize=64M能夠設置大一些,但不能超過MaxPermSize
-Xmx512M的5%爲25.6M,理論上要求-Xmx的數值與-XX:MaxPermSize必須大於25.6M
---------------------
做者:麻花er
來源:CSDN
原文:https://blog.csdn.net/m1509001/article/details/9360191
CSDN:https://blog.csdn.net/kok1992/article/details/44774967java

版權聲明:本文爲博主原創文章,轉載請附上博文連接eclipse

相關文章
相關標籤/搜索