调优需要关注的几个方面
- 内存调优
- CPU 使用调优
- 锁竞争调优
- I/O 调优
- 将转移到老年代的对象数量降到最少。
- 减少Full GC的执行时间。目标是Minor GC时间在100ms以内,Full GC时间在1s以内。
主要调优参数:
设定堆内存大小,这是最基本的。
- -Xms:启动JVM时的堆内存空间。
- -Xmx:堆内存最大限制。
设定新生代大小。
新生代不宜太小,否则会有大量对象涌入老年代。
- -XX:NewRatio:新生代和老年代的占比。
- -XX:NewSize:新生代空间。
- -XX:SurvivorRatio:伊甸园空间和幸存者空间的占比。
- -XX:MaxTenuringThreshold:对象进入老年代的年龄阈值。
设定垃圾回收器
年轻代:-XX:+UseParNewGC。
老年代:-XX:+UseConcMarkSweepGC。
CMS可以将STW时间降到最低,但是不对内存进行压缩,有可能出现“并行模式失败”。比如老年代空间还有300MB空间,但是一些10MB的对象无法被顺序的存储。这时候会触发压缩处理,但是CMS GC模式下的压缩处理时间要比Parallel GC长很多。
G1采用”标记-整理“算法,解决了内存碎片问题,建立了可预测的停顿时间类型,能让使用者指定在一个长度为M毫秒的时间段内,消耗在垃圾收集上的时间不得超过N毫秒。
内存占用调优
OutOfMemoryError 异常原因:可能真的数据量太大、可能要数据显示的太多、可能内存泄露
数据量太大观察及解决:
- 查看 GC 日志, 看 Full GC 前后内存变化, 变化不大说明确实数据量太大
- 尝试增加 JVM 的内存使用
- 考虑这些数据是否真的需要都在内存中吗? 可以考虑使用: LRU 算法换入换出等, 弱引用(Soft References)