JVM常用参数
-XX:+PrintGCDetails:打印gc日志详细信息
-XX:+PrintGCTimeStamps:打印gc发生时相对jvm启动的时间戳,(后来加入了PrintGCDateStamps,打印gc发生的日期)
-Xloggc:设置gc日志的生成位置
-Xms4096M:堆容量初始值
-Xmx4096M:堆容量最大值
-Xmn1024M:新生代容量,所以老年代容量 = 堆容量 - 新生代容量 = 3072M
-Xss256K:线程堆栈空间大小
-XX:MaxDirectMemorySize:Direct Buffer Memory大小
-XX:NewRatio 用来来指定新生代和整个堆的大小比例,或者直接用–XX:NewSize来指定所需的新生代空间
-XX:SurvivorRatio Eden区与Survivor区的大小比值
-XX:MaxTenuringThreshold 设置对象在新生代中最大的存活次数,最大值15,并行回收机制默认为15,CMS默认为4。每经过一次YGC,年龄加1,当survivor区的对象年龄达到TenuringThreshold时,表示该对象是长存活对象,就会直接晋升到老年代
-XX:TargetSurvivorRatio 设定survivor区的目标使用率。默认50,即survivor区对象目标使用率为50%,最高90%
-XX:PretenureSizeThreshold 对象超过多大是直接在旧生代分配
-XX:+CMSParallelRemarkEnabled 降低标记停顿
-XX:MaxPermSize:设置持久代最大值 物理内存的1/4
一般JVM的GC参数可以像这样配置
JAVA_OPTS="$JAVA_OPTS -server -Xms3G -Xmx3G -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/aaa/dump -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/usr/aaa/dump/heap_trace.txt -XX:NewSize=1G -XX:MaxNewSize=1G"
GC 调优原则
在调优之前,我们需要记住下面的原则:
多数的 Java 应用不需要在服务器上进行 GC 优化;
多数导致 GC 问题的 Java 应用,都不是因为我们参数设置错误,而是代码问题;
在应用上线之前,先考虑将机器的 JVM 参数设置到最优(最适合);
减少创建对象的数量;
减少使用全局变量和大对象;
GC 优化是到最后不得已才采用的手段;
在实际使用中,分析 GC 情况优化代码比优化 GC 参数要多得多。
GC 调优目的
将转移到老年代的对象数量降低到最小;
减少 GC 的执行时间。
策略 1:将新对象预留在新生代,由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代是明智的做法,实际项目中根据 GC 日志分析新生代空间大小分配是否合理,适当通过“-Xmn”命令调节新生代大小,最大限度降低新对象直接进入老年代的情况。
策略 2:大对象进入老年代,虽然大部分情况下,将对象分配在新生代是合理的。但是对于大对象这种做法却值得商榷,大对象如果首次在新生代分配可能会出现空间不足导致很多年龄不够的小对象被分配的老年代,破坏新生代的对象结构,可能会出现频繁的 full gc。因此,对于大对象,可以设置直接进入老年代(当然短命的大对象对于垃圾回收老说简直就是噩梦)。-XX:PretenureSizeThreshold 可以设置直接进入老年代的对象大小。
策略 3:合理设置进入老年代对象的年龄,-XX:MaxTenuringThreshold 设置对象进入老年代的年龄大小,减少老年代的内存占用,降低 full gc 发生的频率。
策略 4:设置稳定的堆大小,堆大小设置有两个参数:-Xms 初始化堆大小,-Xmx 最大堆大小。
策略5:注意:如果满足下面的指标,则一般不需要进行 GC 优化:
MinorGC 执行时间不到50ms;
Minor GC 执行不频繁,约10秒一次;
Full GC 执行时间不到1s;
Full GC 执行频率不算频繁,不低于10分钟1次。
原文链接
https://blog.csdn.net/qq_18603599/article/details/81319176
https://zhuanlan.zhihu.com/p/85153215
https://blog.csdn.net/a_dreaming_fish/article/details/51208527