本文總結(jié)項(xiàng)目中經(jīng)常使用的一些重要的jvm參數(shù)
-Xms[unit] 堆最小值
-Xmx[unit] 堆最大值
heap size
設(shè)置的堆的大小,unit
可以是k,m, g分別表示千字節(jié),Mb,Gb。例如我們想配置最小堆為2G,最大堆為4G,如下:
java -Xms2g -Xmx4g -jar demo.jar
在JDK1.8之前所有的靜態(tài)類、方法,final值都保存到PermSize中,尤其是在啟動(dòng)tomcat時(shí),我們通常加上-XX:PermSize=<size>
參數(shù)。避免加載類過多導(dǎo)致OOM。
在JDK1.8之后時(shí)通過Metaspace size,替代了PermSize,據(jù)說會(huì)帶來很多好處,尤其是OOM問題,JVM會(huì)自動(dòng)的調(diào)整這個(gè)值,如果想通過參數(shù)指定,可以使用下面的參數(shù):
-XX:MetaspaceSize=[unit] 初始值
-XX:MaxMetaspaceSize=[unit] 最大值
java -XX:MaxMetaspaceSize=128m -XX:MaxMetaspaceSize=256m
JVM有四種垃圾回收器實(shí)現(xiàn):
4種垃圾回收器實(shí)現(xiàn)機(jī)制,請(qǐng)自行搜索學(xué)習(xí),網(wǎng)上資料很多
4中垃圾回收器,而可以通過下面參數(shù)來進(jìn)行設(shè)置,指定在程序中使用哪種回收器:
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC
當(dāng)我們想看GC工作狀態(tài)時(shí),最簡(jiǎn)單的方式就是配置GC的日志,使用下面的參數(shù),可以記錄GC日志:
-XX:+UseGCLogFileRotation 重復(fù)覆蓋,就像log4j一樣
-XX:NumberOfGCLogFiles=< number of log files > 多少個(gè)文件之后,開始覆蓋之前
-XX:GCLogFileSize=< file size >[ unit ] 每個(gè)日志文件大小
-Xloggc:/path/to/gc.log 日志文件保存路徑和名稱
例如,我們想將文件保存到/home/myan/gclogs/gc.log,保存3個(gè)log,每個(gè)log10M,那么配置如下:
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3-XX:GCLogFileSize=10M -Xloggc:/home/myan/gclogs/gc.log
也可以加上兩個(gè)額外的參數(shù)-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
,打印GC的時(shí)間
在大型的應(yīng)用中,我們經(jīng)常碰到內(nèi)存溢出(簡(jiǎn)稱OOM),我們通常通過配置core dump,將內(nèi)存中信息保存到dump文件,供我們分析,參數(shù)如下:
-XX:+HeapDumpOnOutOfMemoryError 當(dāng)遇到OutOfMemoryError錯(cuò)誤時(shí),JVM會(huì)將dump heap到文件
-XX:HeapDumpPath=./java_pid.hprof 文件的保存路徑,java進(jìn)程的pid會(huì)追加到文件名中
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >" 當(dāng)OOM發(fā)生時(shí),需要執(zhí)行的命令
-XX:+UseGCOverheadLimit
例如:想在發(fā)生OOM錯(cuò)誤時(shí),執(zhí)行重啟服務(wù)的腳本
-XX:OnOutOfMemoryError="./restart-svr.sh"
跟我一起解兩道數(shù)學(xué)題,就知道怎么計(jì)算了。O(∩_∩)O
例題:如果SurvivorRatio=4,Young Gen為30M,那么Eden和Survivor分別時(shí)多少?
令: S = SurvivorSpace E = Eden Y = Young generation 根據(jù)條件得到: S/E = 1/4 那么 E = 4S2S + E = Y2S + 4S = YS = Y/6帶入數(shù)字30,得到:S = 30/6 = 5M,得到Survivor=5M,Eden=20M
例題:如果NewRatio=3, HeapSize=40M, 那么Young Gen為多少?
令:T = TenuredY = Young GenH = Heap根據(jù)條件得到: Y/T = 1/3Y + T = HY + 3Y = H4Y = H帶入數(shù)字40, 得到:4Y = 40, Y = 10,所以Young Gen為10M,那么Tenured為30M
聯(lián)系客服