垃圾回收流程-简单叙述

目录

哪些对象是垃圾:

1.引用计数法

2.可达性分析法

垃圾回收器算法(怎样去回收)

1.标记清除:

2.标记整理:

3.复制:

4.分代:

垃圾回收器:

 1.串行垃圾回收器

 2.并行垃圾回收器

 CMS收集器:

G1垃圾收集器:


哪些对象是垃圾:

1.引用计数法

通过引用的遍历找到对应的实例,让它们的实例数(寿命)+1,如果引用为null了,那么实例的寿命-1;——>把所有引用遍历一遍后,如果对象实例计数(寿命)=0,那么就是垃圾对象——>通过垃圾回收算法进行回收;

缺点:

两个类相互引用:A对象实例是一个指向B对象的引用,然后B对象实例是一个指向A对象的引用;以至于不能回收;

2.可达性分析法

类似于树的遍历,首先会有一个GC root(可以理解为根引用,也就是类初始化就有的),然后这些根引用可以去访问其他对象,然后这些其他的对象也可能具有其他对象的引用;就像一个链条——>只要是在这根链条上的对象,都是可以用的(起始点必须是GC root),否则都是垃圾;

查找完哪些是垃圾之后,我们需要利用垃圾回收器的算法将其回收;


垃圾回收器算法(怎样去回收)

1.标记清除:

标记一下,然后直接清除即可;

缺点:产生空间碎片;

2.标记整理:

标记,清除对象后,再集中没有被回收的对象;

缺点:因为要移动,引用地址会发生改变,时间较长;

3.复制:

先标记找到需要清除的对象,清除后,然后把不被回收的对象放到另外一个内存中,

最后再调换内存;

缺点:多耗费了一个内存;

4.分代:

简单来说就是根据堆内存中的区域不同来进行不同算法以此清除垃圾;

1.新生代采用复制算法;

2.老年代采用标记清除算法;(因为老年代GC很少访问,类也一般不会直接就分配到老年代里面,所以碎片化内存就还好)

长时间存活的对象存入老年代;

具体流程:(10条消息) JVM-02阶段学习_Fairy要carry的博客-CSDN博客

分配原则:

 1.对象优先分配在伊甸园中;

 2.大对象(对象中有很大数组或字符串)直接分配在老年代;

 3.长时间存货的对象也在老年代;

 4.动态对象年龄判定:jvm并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才可以进入老年代,如果幸存区to中年龄相同的所有对象的总空间>=幸存from中的一半,那么年龄>=本年龄的对象可以直接进入老年区

 5.空间分配原则:简单来说,就是在发生Minor GC(在新生代进行GC)情况下,为了防止发生在Minor GC后,Eden有大量存活的对象,导致survivor不能全部存入,这时需要老年代去担保,把这些对象放入老年代,但是要确保老年要存的下。
 

注:当再发生Minor GC时,要在之前检查老年代中的可用连续内存是否>伊甸园中所有对象空间,是,——>晋级老年代;

如果不行可以直接full GC(针对对象复制、转移失败);


垃圾回收器:

之前的回收算法都是为了实现垃圾回收器服务的——>而垃圾回收器就是内存回收的具体实现

两个回收器之间有连线才能配合使用;

 1.串行垃圾回收器

 JDK老版本1.3.1之前,单线程回收器就是唯一的选择——>意思就是:只会用一个CPU后者说一个垃圾收集线程去完成垃圾收集的工作,并且在垃圾回收时,需要暂停其他所有的工作线程;直到垃圾回收完毕,在单CPU环境下,简单高效——>没有线程交互的影响,专门供给垃圾线程收集即可;

串行垃圾收集器有两种:Serial、Serial Old,新生代用Serial(复制算法),老年代用Serial Old(标记整理)

 2.并行垃圾回收器

多CPU环境,采用多线程运行垃圾收集,一般和CMS搭配使用;

新生代(ParNew:相当于是多线程版本的Serial,利用的回收算法也是复制算法)

-XX:+UseParNewGC和SerialOld收集器组合收集垃圾;

Parallel Scavenge:关注吞吐量(新生代版本)

吞吐量优先,吞吐量=代码运行时间/(代码运行时间+垃圾收集时间),高效率利用CPU时间;

吞吐量大小为GCTimeRatio,如果设置了-XX:+UseAdaptiveSizePolicy参数,则随着GC,会动态调整新生代的大小,Eden,Survivor比例等,以提供最合适的停顿时间或者最大的吞吐量。用于新生代收集,复制算法。通过-XX:+UseParallelGC参数,Server模式下默认提供了其和SerialOld进

行分代收集方式;

Parllel Old:Parallel Scavenge的老年代版本,通过-XX:+UseParallelOldGC参数使用Parallel Scavenge+Parallel Old组合进行内存回收;

 CMS收集器:

G1垃圾收集器:

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91435 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年1月15日
下一篇 2022年1月15日

相关推荐