1. JVM内存关键参数

参数均在tomcat/bin/catalina.sh中设置


-server:服务器模式,不配置默认是-client,一定要作为第一个参数。

-Xms和-Xmx:堆的最小值和最大值。线上这俩值必须一致。设置成一样,避免每次GC之后重新分配堆的大小。建议堆的最大值设置为可用内存最大值的80%(使用命令free或cat /proc/meminfo查看,实际可用物理内存=free+buffer+cache)。但是如果真的设置到了80%,服务器的内存可能会使用过高,可以调低一点。

-Xmn:设置堆内存中的年轻代大小,剩下的为年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8

-XX:NewRatio:表示年轻代与年老代的比值,去掉-Xmn这个参数后,默认使用这个参数,比值是2,也就是年轻代占1/3

-XX:SurvivorRatio:设置两个survivor区与eden区的比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

-XX:PermSize和-XX:MaxPermSize(jdk1.7):永久代初始值,默认是物理内存的1/64,永久代最大值,默认是物理内存的1/4。建议分别设置为128、512

-XX:MetaspaceSize和-XX:MaxMetaspaceSize(jdk1.8):同上

-Xss:设定每个线程的栈大小。每个线程都有一个栈,用于保存函数调用、返回地址等,默认为1M,一般不需修改。

-XX:+AlwaysPreTouch:jvm启动的时候就分配内存,其实就是预热的效果。

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=path_address:jvm崩溃的时候会打印出堆信息


如果catalina.sh里没有设置-Xms -Xmx -Xmn等值,可以在以下页面查看,参考:https://blog.51cto.com/11009785/2396840JVM和GC关键参数_第1张图片


2. GC相关的参数

-XX:+UseConcMarkSweepGC:CMS,并发收集器(针对年老代)

-XX:CMSInitiatingOccupancyFraction=75和-XX:+UseCMSInitiatingOccupancyOnly一起使用,设定CMS在对内存占用率达到75%的时候开始GC(控制频率,减少时常),第二个参数就是说要用前面设定的值。默认这个值是 -1,使用以下命令,可以查看设置的值,其中2713改为java的pid(通过ps -ef | grep java查看)

jinfo -flag CMSInitiatingOccupancyFraction 2713

然而,请记住大多数情况下,JVM比我们自己能作出更好的垃圾收集决策。因此,只有当我们充足的理由(比如测试)并且对应用程序产生的对象的生命周期有深刻的认知时,才应该使用该标志。

-XX:+ExplicitGCInvokesConcurrent:在CMS中并行执行GC,不会暂停,提升GC效率

-XX:+ParallelRefProcEnabled和-XX:+CMSParallelInitialMarkEnabled一起使用,在CMS中并行执行,减少暂停时间

-XX:+CMSScavengeBeforeRemark:在CMS GC之前执行一次ygc(ygc针对年轻代,CMS GC针对年老代),避免CMS GC和ygc连在一起执行从而增大暂停时间

-XX:+UseCMSCompactAtFullCollection:CMS是不会整理堆碎片的,加上此参数可以对存活的对象进行整理,使memory碎片减少

-XX:CMSFullGCsBeforeCompaction=3: 多少次Full GC 后压缩old generation一次。应该是针对-XX:+UseCMSCompactAtFullCollection设置的次数。

-XX:+CMSClassUnloadingEnabled:(只有在UseConcMarkSweepGC也启用的情况下才有用)在使用CMS垃圾回收机制的时候是否启用类卸载功能。默认这个是设置为不启用的,如果你启用了CMSClassUnloadingEnabled ,垃圾回收会清理持久代,移除不再使用的classes。

-XX:+PrintGCDateStamps -verbose:gc,在log里打印GC的详细信息


一般来说,根据下面的风格设置:

JVM和GC关键参数_第2张图片


更多的参数及介绍,请参考:

https://www.cnblogs.com/hongdada/p/10277782.html