1. Java內(nèi)存設(shè)置推薦參數(shù)
- 堆內(nèi)存參數(shù):
- -Xmx512m: 最大總堆內(nèi)存,推薦設(shè)置為物理內(nèi)存的1/4
- -Xms512m: 初始總堆內(nèi)存,推薦和最大堆內(nèi)存一樣大(GC之后就不必調(diào)整堆內(nèi)存大?。?/li>
- -Xmn192m: 年輕代堆內(nèi)存,官方推薦為整個(gè)堆的3/8
- 永久代參數(shù)
- -XX:PermSize=128m 堆的初始大小,一般設(shè)置為128m即可,原則為預(yù)留30%的空間
- XX:MaxPermSize=128m:堆的最大大小,一般設(shè)置為128m即可,原則為預(yù)留30%的空間
2. 查看內(nèi)存使用
- 查看JVM 的配置
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
- 查看程序內(nèi)存占用
// 可以直接看到內(nèi)存及cpu占用
top
// 查看某一具體進(jìn)程程序
top -p pid
// 查看內(nèi)存占用
ps -aux|grep xxx
// 會(huì)打印當(dāng)前進(jìn)程詳細(xì)情況,內(nèi)存是VmRSS
cat /proc/pid/status
3. 設(shè)置Java 內(nèi)存限制方法
- 直接通過java 命令去執(zhí)行class文件的時(shí)候設(shè)置JVM參數(shù)
java -Xms512m -Xmx512m helloword
- eclipse可以在eclipse.ini 配置文件中設(shè)置,也可以在eclipse執(zhí)行一個(gè)java類時(shí),通過右鍵的參數(shù)添加部分去設(shè)置
- 一般的像tomcat,weblogic這些web容器,都是應(yīng)用jvm啟動(dòng)的,所以在他們的啟動(dòng)腳本中都會(huì)去調(diào)用JVM,就可以在他們的啟動(dòng)腳本中設(shè)置堆棧的大小
- springboot 項(xiàng)目設(shè)置內(nèi)存限制
// 設(shè)置啟動(dòng)參數(shù)
java -Xms1g -Xmx2g -jar xxx.jar
- 啟動(dòng)jvm 手動(dòng)設(shè)置內(nèi)存
// 每次jvm進(jìn)行垃圾回收時(shí)顯示內(nèi)存信息,jvm的堆內(nèi)存設(shè)為固定20M
java -verbose:gc -Xms20M -Xmx20M
- 修改系統(tǒng)環(huán)境變量,設(shè)置JVM的JAVA_TOOL_OPTIONS
vi ~/.bashrc
export JAVA_TOOL_OPTIONS='-Xms30g -XMx30g'
source ~/.bashrc
注意:
- 設(shè)置內(nèi)存限制最好檢查一下物理內(nèi)存是否充足
- 另外注意一臺(tái)機(jī)器上多個(gè)jar應(yīng)用,建議分別各個(gè)程序的內(nèi)存限制
- 設(shè)置內(nèi)存限制防止程序超過系統(tǒng)物理最大限制內(nèi)存,從而被系統(tǒng)殺掉
- 限定的內(nèi)存不能低于程序正常需要,當(dāng)程序QPS大、耗內(nèi)存任務(wù)比較多,內(nèi)存限制不用設(shè)置過小
- 當(dāng)程序運(yùn)行時(shí)候超過程序的設(shè)置的內(nèi)存限制,會(huì)不斷的gc,如果還不夠,會(huì)讓該線程直接OOM,從而釋放內(nèi)存,然后如果此線程還不能回收,java會(huì)不斷的啟動(dòng)gc線程回收內(nèi)存,最后CPU飚滿,java應(yīng)用沒響應(yīng)
- -Xmx設(shè)置的是總堆內(nèi)存限制,但是JVM運(yùn)行過程中到底會(huì)向操作系統(tǒng)申請(qǐng)多少內(nèi)存,這個(gè)是由JVM在運(yùn)行過程中動(dòng)態(tài)決定的,我們無法設(shè)置,比如JVM本身對(duì)堆內(nèi)存管理,垃圾回收,動(dòng)態(tài)庫加載等等都不在堆內(nèi)存限制范圍內(nèi)