JVM垃圾回收机制及调优

Minor gc、Full gc触发条件

JVM垃圾回收机制及调优
堆中存放着java程序中所有的对象实例,jvm垃圾回收机制这是对堆中没有被引用的垃圾对象进行清理。

  • Minor gc(清理年轻代):对象的实例会存放在堆中的Eden空间区,当Eden空间被存放满时,则会进行Minor gc,根据特定的回收策略将没有被引用的对象视为垃圾对象将其清除,并将存活的对象复制带From区并标记其年龄值为1。在Eden空间区再次满时,则会进行Eden空间区和From区中的垃圾对象清除,并且将Eden空间区和From区存活的对象复制到To区,并将其年龄值+1。第三次,同理,存活对象在From区与To区之间复制。
    年龄值:当年龄值达到15时(15为默认值,可修改),会将对象复制到老年代。

  • Full gc(清理整个堆空间,包括年轻代,老年代,永久代):
    1)老年代空间不足
    2)方法区空间不足
    3)Minor gc 后存活的对象复制进Survivor区域中(其中一块区)的大小超过了这块区域的百分之五十,则会将这些对象直接复制进老年代,不会存放在Servivor区。
    4)Minor gc 后进入老年代的大小超过老年代可用空间
    5)调用System.gc时

注意:
在进行Minor gc以及Full gc之前java应用程序的其他所有线程都会被挂起,Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互,这些现象多半是由于gc引起(称为STW:Stop The World)。

对象回收策略

JVM垃圾回收机制及调优
可达性分析算法
将"GC Roots"对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的都是垃圾对象。
"GC Roots"根节点:线程栈的本地变量、静态变量、本地方法栈的变量等待。
例如:在线程栈中的本地变量中取找是否引用堆中的某个对象,再继续判断该对象是否引用其他对象,有则同理继续往下找。找到没有引用位置,则在该链上的对象都将标记未非垃圾对象。

JVM调优调什么

减少或几乎不发生Full GC:
Full GC 的速度比 Minor GC 慢非常多,Minor GC 是只针对年轻代进行垃圾清理,而Full GC 是对年轻代、老年代、方法区进行垃圾清理。所以尽量避免进行Full GC。