面试精选

JVM调优总结

2021-03-23  本文已影响0人  逍遥白亦

本篇从以下几个方面,对JVM调优进行总结

1. YoungGC 频繁

如果线上频繁YoungGC,应该如何解决呢?想有整体思路的话,不防先用反推法,先看原理。

1.1 触发时机

当 JVM 无法为新对象分配在新生代内存空间时总会触发 Young GC。比如 Eden 区占满时,新对象分配频率越高,Young GC 的频率就越高。

1.2 问题的原因

可以发现,当Eden区占满不足以分配新对象时,就会触发YoungGC。

1.3 问题排查

首先先用Jstat工具,观察GC变化,再结合业务逻辑查看是不是新生代设置小了,比如系统每秒产生60M的对象,但是新生代的Eden区只设置为600M,那么不到10秒Eden区就满了,那么在内存允许的范围内,应该加大Eden区的内存,尽量减少YoungGC的次数。

2. FullGC 频繁

2.1 触发时机

2.2 问题的原因

核心点就一条,老年代的存储空间满了或者将要满了。

2.3 问题排查

根据实际经验,频繁FullGC一般是由于代码问题导致的大对象过多,FullGC之后还是清不掉,所以先用Jmap工具,打印出当时程序里的大对象,然后对照类名,查看代码,看看是不是有从数据库查询出来的一大堆对象,或者某个递归没有终止导致一直创建大对象。

3. OOM问题

3.1 堆内存不足

报错:

java.lang.OutOfMemoryError: Java heap space

原因:

解决方法:

3.2 方法栈溢出

报错:

java.lang.OutOfMemoryError : unable to create new native Thread

原因:
出现这种异常,基本上都是创建的了大量的线程导致的,以前碰到过一次,通过jstack出来一共8000多个线程

解决:

3.3 永久代/元空间溢出

报错:

java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Metaspace

原因:

解决方案:

4. 大型系统JVM参数设置

4.1 思路

5. G1收集器优化建议

5.1 不要设置年轻代大小

显式的使用-Xmn设置年轻代的大小,会干预G1的默认行为。

5.2 响应时间指标

不要根据平均响应时间(ART)作为衡量标准去设定XX:MaxGCPauseMillis=<N>选项,而是设定一个想在90%或者以上的时间都会满足这目标的值。也就是说90%的用户,都会在目标时间,甚至更短的时间内得到响应。记住设定的目标时间只是一个目标,不能保证永久都会满足这个目标。

5.3 MixedGC优化

5.4 to-space overflow 和 to-space exhausted 问题

当在gc日志中出现to-space overflow或者to-space exhausted消息时,说明没有足够的内存来存储晋升对象或者survivor对象,gc日志示例如下:

924.897: [GC pause (G1 Evacuation Pause) (mixed) (to-space exhausted), 0.1957310 secs]

924.897: [GC pause (G1 Evacuation Pause) (mixed) (to-space overflow), 0.1957310 secs]

要缓解此问题,可以尝试以下调整:

参考资料

  1. https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html
上一篇下一篇

猜你喜欢

热点阅读