JVM调优

JVM调优主要是减少GC的频率和Full GC次数,STW(stop the world)的停顿时间和次数

STW(Stop The World)在Java垃圾收集器中的一个概念,意思是“停止世界”。它指的是在垃圾收集时,Java虚拟机暂停其他所有的工作线程,只有垃圾收集线程在工作

在STW期间,除了GC线程外,所有的Java应用程序线程都会被挂起,使程序暂停执行。STW的目的是为了在进行GC时防止应用程序线程和GC线程同时访问Java堆,保证垃圾收集的原子性

jvm优化原则尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收

什么样的情况下会有Full GC发生

  • 老年代空间不足:Survivor区域的对象满足晋升到老年代的条件时,晋升进入老年代的对象大小大于老年代的可用内存,这个时候会触发Full GC。,当执行Full GC后空间仍然不足,则抛出错误:java.lang.OutOfMemoryError: Java heap space 。为避免以上两种状况引起的FullGC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组
  • Metaspace区内存达到阈值:Metaspace使用的是本地内存,而不是堆内存,如果设置-XX:MetaspaceSize参数,那么超过这个值就会触发FULL GC
  • 堆中产生大对象超过阈值:这个参数可以通过-XX:PretenureSizeThreshold进行设定,大对象或者长期存活的对象进入老年代,典型的大对象就是很长的字符串或者数组,它们在被创建后会直接进入老年代,在要放置的时候JVM如果发现老年代的空间不足时,会触发Full GC
  • 老年代连续空间不足:JVM如果判断老年代没有做足够的连续空间来放置大对象,那么就会引起Full GC,例如老年代可用空间大小为100K,但不是连续的,连续内存只要80K,而晋升到老年代的对象大小为100K,由于100>80的连续空间,所以就会触发Full GC

什么情况下需要进行JVM调优?

  • Heap内存(老年代)持续上涨达到设置的最大内存值
  • Full GC 次数频繁
  • GC 停顿时间过长(超过1秒)
  • 应用出现OutOfMemory 等内存异常
  • 应用中有使用本地缓存且占用大量内存空间
  • 系统吞吐量与响应性能不高或下降

一、使用jstack找出占用CPU最高的线程堆栈信息

1、通过命令top -p pid,查看java进程的内存情况,如图:

2、按H,获取每个线程的内存情况,如图:

3、将上面占用cpu和内存较高的线程pid转为16进制,然后获取堆栈信息,如下:

上面是打印这个线程的后10行信息,可以看到导致CPU飙高的调用方式是什么

标签