參數(shù)設置背景
在做java開發(fā)時尤其是大型軟件開發(fā)時經(jīng)常會遇到內(nèi)存溢出的問題,比如說OutOfMemoryError等。這是個讓開發(fā)人員很痛苦、也很糾結(jié)的問題,因為我們有時不知道什么樣的操作導致了這種問題的發(fā)生。所以我們不得不通過不斷的審查、優(yōu)化自己的代碼結(jié)構(gòu)。但是有時我們會發(fā)現(xiàn)有些時候不單單是通過重構(gòu)自身的代碼就能夠解決這樣的問題,因為也可能是由于我們對java虛擬機運行時的內(nèi)存分配的不得當導致了內(nèi)存溢出現(xiàn)象的不斷發(fā)生。
為了解決這一問題,java開發(fā)團隊提供了一個用戶自定義的方式按需配置java虛擬機運行時的所需的內(nèi)存——通過參數(shù)配置的形式實現(xiàn)參數(shù)分配自定義化。
JVM按照其存儲數(shù)據(jù)的內(nèi)容將所需內(nèi)存分配為堆區(qū)與非堆區(qū)兩個部分:
- 堆區(qū)即為通過new的方式創(chuàng)建的對象(類實例)所占用的內(nèi)存空間
- 非堆區(qū)即為代碼、常量、外部訪問(如文件訪問流所占資源)等
雖然java的垃圾回收機制雖然能夠很好的解決內(nèi)存浪費的問題,但是這種機制也僅僅的是回收堆區(qū)的資源,而對于非堆區(qū)的資源就束手無策了,針對這樣的資源回收只能憑借開發(fā)人員自身的約束來解決。就算是這樣(堆區(qū)有java回收機制、非堆區(qū)開發(fā)人員能夠很好的解決),當運行時所需內(nèi)存瞬間激增的時候JVM無奈的也要中止程序的運行。所以本文講述的是如何解決后者的問題。
常見參數(shù)種類(配置內(nèi)存)
- 配置堆區(qū):-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn
- 配置非堆區(qū):-XX:PermSize、-XX:MaxPermSize
堆區(qū)參數(shù)配置
1、-Xms :表示java虛擬機堆區(qū)內(nèi)存初始內(nèi)存分配的大小,通常為操作系統(tǒng)可用內(nèi)存的1/64大小即可,但仍需按照實際情況進行分配。有可能真的按照這樣的一個規(guī)則分配時,設計出的軟件還沒有能夠運行得起來就掛了。 2、-Xmx: 表示java虛擬機堆區(qū)內(nèi)存可被分配的最大上限,通常為操作系統(tǒng)可用內(nèi)存的1/4大小。但是開發(fā)過程中,通常會將 -Xms 與 -Xmx兩個參數(shù)的配置相同的值,其目的是為了能夠在java垃圾回收機制清理完堆區(qū)后不需要重新分隔計算堆區(qū)的大小而浪費資源。
一般來講對于堆區(qū)的內(nèi)存分配只需要對上述兩個參數(shù)進行合理配置即可。
非堆區(qū)參數(shù)配置
1、-XX:PermSize:表示非堆區(qū)初始內(nèi)存分配大小,其縮寫為permanent size(持久化內(nèi)存) 2、-XX:MaxPermSize:表示對非堆區(qū)分配的內(nèi)存的最大上限
注:
在配置之前一定要慎重的考慮一下自身軟件所需要的非堆區(qū)內(nèi)存大小,因為此處內(nèi)存是不會被java垃圾回收機制進行處理的地方。并且更加要注意的是 最大堆內(nèi)存與最大非堆內(nèi)存的和絕對不能夠超出操作系統(tǒng)的可用內(nèi)存。
參考:http://blog.csdn.net/kok1992/article/details/44774967
|