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

2023-12-28  本文已影响0人  酱油瓶儿_fea9

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

回收目标

堆内存的划分

盗取一张图


image.png

新生代各个分区的含义

垃圾回收有哪些

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

  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中存储,存不下的进入到老年代,但是进入老年代前会进行一系列条件判断,如果老年代可用的连续空间大于那些需要进入到老年代,则直接进入,如果不大于,那么就需要有以下的处理
  1. 随着老年代的空间不断的减少,当达到某个阈值时,负责老年代的垃圾回收器就会进行垃圾回收,比如CMS,来降低老年代中的内存使用,尽量避免因为晋升老年代失败导致的FullGC。
  2. 以CMS垃圾回收器为例,CMS在初始标记与重新标记时是暂停所有线程的,但是在并发标记与并发清除时是与应用程序线程一起执行的,意味着在并发清除的过程中也会产生对象,随之产生MinorGC。因此如果在并发清除阶段,如果通过MinorGC进入老年代的对象大于老年代清理的速度,这是就会产生concurrent mode failure,意味着某次MinorGC后需要进入到老年代的对象比老年代最大的可用连续空间要多,无法放入老年代,此时JVM就会触发一次FullGC

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

上一篇 下一篇

猜你喜欢

热点阅读