简介
JVM常见的问题就是GC进行频繁导致吞吐量减少,已经程序发生OOM而导致程序运行异常; 但是如果想了解OOM就必须知道JVM的垃圾回收的原理或者过程是什么样的;下面就来分别讨论下垃圾回收的过程是什么样的和遇到OOM的时候如何进行分析。
垃圾回收的流程
一般的流程都是对象先创建出来然后被放到Eden
区域,然后Eden
满的时候就会触发Minor GC;当然具体的流程可以看下面图,这个图也不是全部的情况,只是大多数对象被回收的情况。
比如有点对象在进入到Eden
之前就可能进入到老年代,这个情况也是有可能的,下面图中并没有表示出来。
Minor GC, Major GC和Full GC
JVM的调优分为两点:1.让JVM进行回收的次数减少(stop the world次数减少),从而提高系统的吞吐量;2.排查问题发现OOM的原因,然后避免发生OOM;
Minor GC:主要是针对新生代(Eden,Survivor)进行回收;Eden满了会触发Minor GC, Survivor满了不会进行Minor GC;
Major GC:主要是针对老年代进行回收;
Full GC:整个堆和方法区进行垃圾回收;
逃逸分析
逃逸分析简单来说就是看一个对象是否只在函数内生效,如果逃出函数那么则称之为逃逸。大部分对象创建都是在堆中创建的,但是如果开启了逃逸分析,并且对象只在函数内生效,那么这些对象很可能被分配到栈上,当方法执行完那么这些对象就会被回收掉。
1
https://xuranus.github.io/2021/04/07/Java%E9%80%83%E9%80%B8%E5%88%86%E6%9E%90/
参考资料
- https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html