应该分为
1.系统层面: 合理的 openfile数 用 -server模式 打开limit限制
2.代码层面的,尽量用局部变量,用小而美的对象
3. 用 jstat -gcutil 获取 Minor GC,Full GC的平均值 如果GC执行时间满足下列所有条件,就没有必要进行GC优化了
Minor GC执行非常迅速(50ms以内)
Minor GC没有频繁执行(大约10s执行一次)
Full GC执行非常迅速(1s以内)
Full GC没有频繁执行(大约10min执行一次)
查看JVM所有参数:
jinfo -flags pid
jstat -gcutil pid 200 20
这个命令意思就是每隔200ms输出pid 的gc情况,一共输出20次
从应用程序启动到采样时发生 Young GC 的次数)和YGCT(从应用程序启动到采样时 Young GC 所用的时间(秒)),计算YGCT/YGC会得出,平均每次新生代的GC耗时50ms,这是一个很小的数字,通过这个结果可以看出,我们大可不必关注新生代GC对GC性能的影响。
现在来看一下FGC( 从应用程序启动到采样时发生 Full GC 的次数)和FGCT(从应用程序启动到采样时 Full GC 所用的时间(秒)),计算FGCT/FGC会得出,平均每次老年代的GC耗时19.68s。有可能是执行了三次Full GC,每次耗时19.68s,也有可能是有两次只花了1s,另一次花了58s。不管是哪一种情况,GC优化都是很有必要的。
4. 从配置 垃圾回收器,最大堆 最小堆, 新生代和老年代的比例 分别压测周内 运行的 情况来 选择合适的 条件
Case 1: -XX:+UseParallelGC -Xms1536m -Xmx1536m -XX:NewRatio=2
Case 2: -XX:+UseParallelGC -Xms1536m -Xmx1536m -XX:NewRatio=3
Case 3: -XX:+UseParallelGC -Xms1g -Xmx1g -XX:NewRatio=3
Case 4: -XX:+UseParallelOldGC -Xms1536m -Xmx1536m -XX:NewRatio=2
Case 5: -XX:+UseParallelOldGC -Xms1536m -Xmx1536m -XX:NewRatio=3
Case 6: -XX:+UseParallelOldGC -Xms1g -Xmx1g -XX:NewRatio=3
准备6台机器, 压测2-3天,看下那种表现好,就用那种 配置