-Xmn1024m -Xms2500m -Xmx2500m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:MaxDirectMemorySize=256m -XX:+UseCMSInitiatingOccupancyOnly -XX:SurvivorRatio=8 -XX:+ExplicitGCInvokesConcurrent -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/www/logs/gc-%%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/www/logs -Djava.io.tmpdir=/var/www/tmp
-Xmn1024m -Xms2500m -Xmx2500m -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70 -XX:MaxDirectMemorySize=256m
-XX:+UseCMSInitiatingOccupancyOnly -XX:SurvivorRatio=8
-XX:+ExplicitGCInvokesConcurrent -XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-Xloggc:/var/www/logs/gc-%%t.log
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=10m -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/www/logs -Djava.io.tmpdir=/var/www/tmp
一:理解GC日志格式,读GC日志的方法
1:开启日志
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/path/gc.log
-XX:+UseGCLogFileRotation 启用GC日志文件的自动转储 (Since Java)
-XX:NumberOfGClogFiles=1 GC日志文件的循环数目 (Since Java)
-XX:GCLogFileSize=1M 控制GC日志文件的大小 (Since Java)
-XX:+PrintGC包含-verbose:gc
-XX:+PrintGCDetails //包含-XX:+PrintGC
只要设置-XX:+PrintGCDetails 就会自动带上-verbose:gc和-XX:+PrintGC
-XX:+PrintGCDateStamps/-XX:+PrintGCTimeStamps 输出gc的触发时间
二:参数配置和理解
1:参数分类和说明
jvm参数分固定参数和非固定参数
1):固定参数
如:-Xmx,-Xms,-Xmn,-Xss.
2):非固定参数
如:
-XX:+<option> 启用选项
-XX:-<option> 不启用选项
-XX:<option>=<number> 给选项设置一个数字类型值,可跟单位,例如 128k, 2g
-XX:<option>=<string> 给选项设置一个字符串值,例如-XX:HeapDumpPath=./dump.log
2:JVM可设置参数和默认值
1):-XX:+PrintCommandLineFlags
打印出JVM初始化完毕后所有跟最初的默认值不同的参数及它们的值,jdk1.5后支持.
线上建议打开,可以看到自己改了哪些值.
2):-XX:+PrintFlagsFinal
显示所有可设置的参数及"参数处理"后的默认值。参数本身只从JDK6 U21后支持
可是查看不同版本默认值,以及是否设置成功.输出的信息中"="表示使用的是初始默认值,而":="表示使用的不是初始默认值
如:jdk6/7 -XX:+MaxTenuringThreshold 默认值都是15,但是在使用CMS收集器后,jdk6默认4 , jdk7默认6.
三:JVM内存区域理解和相关参数
一图胜千言,直接上图
1):物理分代图.
物理分代是除G1之外的JVM 内存分配方式,jvm 通过-Xmx,-Xmn/newRatio等参数将jvm heap划分成物理固定大小,对于不同场景比例应该设置成多少很考验经验.
一篇JVM CMS优化讲解的非常好的文章: how-tame-java-gc-pauses
2) 逻辑分代图(G1)
逻辑分代是以后的趋势(PS:jdk8连perm都不区分了。), 不需要使用者在纠结Xms/Xmn,SurvivorRatio等比例问题,采用动态算法调整分代大小。