天天看點

jvm中 -Xms -Xmx -XX:PermSize -XX:MaxPermSize 差別

閱讀目錄

  • 參數設定背景    
  • 常見參數種類(配置記憶體)
  • 堆區參數配置
  • 非堆區參數配置

回到頂部

參數設定背景    

在做java開發時尤其是大型軟體開發時經常會遇到記憶體溢出的問題,比如說OutOfMemoryError等。這是個讓開發人員很痛苦、也很糾結的問題,因為我們有時不知道什麼樣的操作導緻了這種問題的發生。是以我們不得不通過不斷的審查、優化自己的代碼結構。但是有時我們會發現有些時候不單單是通過重構自身的代碼就能夠解決這樣的問題,因為也可能是由于我們對java虛拟機運作時的記憶體配置設定的不得當導緻了記憶體溢出現象的不斷發生。

為了解決這一問題,java開發團隊提供了一個使用者自定義的方式按需配置java虛拟機運作時的所需的記憶體——通過參數配置的形式實作參數配置設定自定義化。

JVM按照其存儲資料的内容将所需記憶體配置設定為堆區與非堆區兩個部分:

  • 堆區即為通過new的方式建立的對象(類執行個體)所占用的記憶體空間
  • 非堆區即為代碼、常量、外部通路(如檔案通路流所占資源)等

雖然java的垃圾回收機制雖然能夠很好的解決記憶體浪費的問題,但是這種機制也僅僅的是回收堆區的資源,而對于非堆區的資源就束手無策了,針對這樣的資源回收隻能憑借開發人員自身的限制來解決。就算是這樣(堆區有java回收機制、非堆區開發人員能夠很好的解決),當運作時所需記憶體瞬間激增的時候JVM無奈的也要中止程式的運作。是以本文講述的是如何解決後者的問題。

回到頂部

常見參數種類(配置記憶體)

  • 配置堆區:-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn
  • 配置非堆區:-XX:PermSize、-XX:MaxPermSize

回到頂部

堆區參數配置

1、-Xms :表示java虛拟機堆區記憶體初始記憶體配置設定的大小,通常為作業系統可用記憶體的1/64大小即可,但仍需按照實際情況進行配置設定。有可能真的按照這樣的一個規則配置設定時,設計出的軟體還沒有能夠運作得起來就挂了。

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

    一般來講對于堆區的記憶體配置設定隻需要對上述兩個參數進行合理配置即可。

回到頂部

非堆區參數配置

1、-XX:PermSize:表示非堆區初始記憶體配置設定大小,其縮寫為permanent size(持久化記憶體)

2、-XX:MaxPermSize:表示對非堆區配置設定的記憶體的最大上限

注:    

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

參考:http://blog.csdn.net/kok1992/article/details/44774967

繼續閱讀