美文网首页
简单一文总结垃圾回收的整个过程都是精髓

简单一文总结垃圾回收的整个过程都是精髓

作者: 酱油瓶儿_fea9 | 来源:发表于2023-12-28 20:57 被阅读0次

之前对垃圾回收的过程有了解,但是还是比较模糊只局限于零碎的知识点,整个流程没有串起来,今天有空详细了解了一下整个过程,在此记录一下。

回收目标

  • 主要是堆内存垃圾回收
  • 其次也包含方法区(1.8之后也叫源空间meta)垃圾回收
    下面主要介绍堆内存的收集

堆内存的划分

盗取一张图


image.png
  • 老年代:用来存储多次经历过Minor GC后仍然存活的对象(包括达到指定年龄代的对象以及Monior GC后无法放入suvivor区的对象,无法放入的部分才会放入老年代)
  • 新生代:用来存储程序刚刚分配的对象,以及未达到指定年龄代的对象

新生代各个分区的含义

  • eden:程序运行新产生的对象首先会进入eden区
  • survivor:survivor有两部分,可以称为 s1, s2 ,其中一块用来存储MinorGC后的数据,比如开始是Eden+s1满了之后触发MinorGC,然后把存活的对象移入s2区,然后程序再往eden+s2区放入新对象,触发MinorGC后把存活的对象放入s1,依次循环

垃圾回收有哪些

  • MinorGC: 回收新生代的垃圾,不会暂停用户线程
  • FullGC:回收整个堆的垃圾,既包含老年代又包含新生代,会暂停用户线程
  • Major GC:回收老年代中的垃圾,常用的如CMS垃圾回收器,当老年代的空间达到设定的阈值时(-XX:CMSInitiatingOccupancyFraction与-XX:+UseCMSInitiatingOccupancyOnly参数决定的),垃圾回收器会收集老年代中的垃圾,避免产生FullGC

从产生垃圾到垃圾回收产生的流程

  1. 程序运行产生对象存放到eden与s1中,当新创建的对象无法在eden+s1中找到空间则出发MinorGC
  2. 如果MinorGC之后存活的对象小于s2的空间,则放入s2同时存活对象的年龄代+1,下次是回收eden+s2,然后将存活对象放入到s1
  3. 重复步骤2,如果在某次回收中存活的对象的年龄代 > MaxTenuringThreshold设置的值,这部分对象直接进入老年代,剩下的进入s1或s2中的一个
  4. 随着运行,突然某一次MinorGC后存活的对象很多,多到整个s1或者s2区放不下,这时候会尽量往s1或s2中存储,存不下的进入到老年代,但是进入老年代前会进行一系列条件判断,如果老年代可用的连续空间大于那些需要进入到老年代,则直接进入,如果不大于,那么就需要有以下的处理
  • 在JDK 6 Update 24之后,JVM直接进行一次FullGC,HandlePromotionFailure参数没有意义了
  • 在JDK 6 Update 24之前,如果HandlePromotionFailure 为true,JVM会再次尝试进行一次MinorGC,但是尝试是有条件的,条件就是老年代的连续空间需要大于历次MinorGC晋升到老年对象的平均值,如果小于JVM就会放弃尝试直接进行FullGC。如果JVM尝试后还是无法将多于的对象放入老年代,那么JVM就会进行FullGC;如果HandlePromotionFailure为false,JVM则直接进行FullGC
    据说在JDK 6 Update 24前后的变化是因为JVM能够更为智能的处理老年代晋升失败这种情况了
  1. 随着老年代的空间不断的减少,当达到某个阈值时,负责老年代的垃圾回收器就会进行垃圾回收,比如CMS,来降低老年代中的内存使用,尽量避免因为晋升老年代失败导致的FullGC。
  2. 以CMS垃圾回收器为例,CMS在初始标记与重新标记时是暂停所有线程的,但是在并发标记与并发清除时是与应用程序线程一起执行的,意味着在并发清除的过程中也会产生对象,随之产生MinorGC。因此如果在并发清除阶段,如果通过MinorGC进入老年代的对象大于老年代清理的速度,这是就会产生concurrent mode failure,意味着某次MinorGC后需要进入到老年代的对象比老年代最大的可用连续空间要多,无法放入老年代,此时JVM就会触发一次FullGC

以上是从产生对象到垃圾回收的整个过程,此过程没有详细介绍细节中的概念只是注重流程,具体每步骤的涉及的概念以及详细过程并未解决,可以网站上检索

相关文章

  • 垃圾回收的整个过程

    过程描述 优先在eden分配 大对象直接进去老年代 年轻代分配失败 进行minor gc minor gc前会 老...

  • 标记清除

    垃圾回收过程经常使用(也是最简单)的算法是标记清除(mark and sweep)。整个过程分为三步。 (1) 迭...

  • JVM垃圾回收算法

    Java基础:JVM垃圾回收算法 [toc] 参考:Java基础:JVM垃圾回收算法图解JVM垃圾回收算法 总结:...

  • 垃圾回收

    如何查看当前JVM使用的垃圾回收器? 如何指定使用CMS回收? 如何打印回收日志? 垃圾回收过程 CMS垃圾回收的...

  • 垃圾回收算法、回收机制与总结 ---JVM

    垃圾回收算法、回收机制与总结 ---JVM 一、垃圾回收算法 1.标记清除 标记--清除算法将垃圾回收分为两个阶段...

  • JVM-007-JVM调优之基础理论

    一、认识Garbage  Garbage,垃圾。 Java回收垃圾的方式是采用垃圾回收器。那么什么是垃圾? 简单的...

  • JVM常见垃圾回收器介绍

    垃圾回收器简介 在新生代和老年代进行垃圾回收的时候,都是要用垃圾回收器进行回收的,不同的区域用不同的垃圾回收器。分...

  • 从萌新的角度理解垃圾收集器

    从萌新的角度理解内存回收一文,详细的描述了内存回收(又称垃圾收集)涉及的相关方法论。垃圾收集器就是依据内存回收方法...

  • 2020-04-03 JVM垃圾回收相关文章引用

    这三篇文章总结的非常到位,收藏在这里。 Jvm垃圾回收器(基础篇) Jvm垃圾回收器(算法篇) Jvm垃圾回收器(...

  • JVM垃圾回收GC算法

    一. 什么叫做垃圾回收 垃圾回收(Garbage Collection, GC)简单来说,就是把不在使用的对象清除...

网友评论

      本文标题:简单一文总结垃圾回收的整个过程都是精髓

      本文链接:https://www.haomeiwen.com/subject/fbfjndtx.html