写点什么

第九周. 命题作业 -GC 原理

用户头像
刘璐
关注
发布于: 2020 年 08 月 05 日
第九周.命题作业-GC原理

一、时间不确定

Garbage Collection,是后台的守护进程。且,他是一个低优先级进程,可根据内存的使用情况动态调整优先级。因此,在内存低到一定限度时,才会自动运行。以实现对内存的回收。

二、限制

GC只能回收通过new 关键字申请的内存(堆上,但堆上的内存不全是通过new申请)。针对不能GC自动回首的本地方法,需要在finalize中,调用释放操作,在现实调用 system.gc()。

三、原理

3.1 判断对象是否存活的方法

1.引用技术算法:其他对象有引用,则计数器加一,失效的时候,计数器减一。计数器为0时,可以被回收。但是当两个对象互相引用的时候,这两个对象都无法被回收。

2.可达性分析算法:通过GC ROOTs的对象为起始点,向下搜索,走过的路径为引用链,如果对象到GCRoots没有任何引用脸,则说明子对象不可达,可以被回收。但是当两个对象互相引用的时候,这两个对象都无法被回收。

3.2 垃圾回收算法

1.标记-清楚算法(Mark-Sweep)

标记阶段标记出所有要回收的对象,标记完成后统一回收。缺点是,需要stop-the-world,且内存不连续。

2.复制算法(Copying)

将可用内存分为Eden空间和Survivor(from/to)空间,比例约为8:1:1。Eden用完以后,将还存活的内存复制到survivor空间。

3.标记整理算法(Mark-Compact)

先标记可回收的对象,然后把所有存活的对象向一端移动,可回收的向另一端移动,最后清理掉边界以外的内存。

4.分代收集算法

也是一种标记整理算法,根据对象存活周期分成块。标记为新生代和老年代,然后根据不同带的特点选用不同的算法。

3.3 垃圾收集器

1.Serial(新生代)/Serial Old(老年代)

单线程收集器,收集的时候,停止所有的工作线程。

2.ParNew

多线程,逻辑和Serial一致,CMS只能与ParNew或者Serial配合使用

3.Parallel Scavenge(新生代)/Parallel Old(老年代)

吞吐量优先的收集器,即有限考虑CPU用于运行代码的时间与CPU的总运行时间的比值。

4.CMS

以获取最短回收停顿时间为目标的收集器

5.G1

(1) 并行与并发,缩短stop-the-world时间

(2) 分代收集

(3) 空间整合

(3) 可预测的停顿。



用户头像

刘璐

关注

还未添加个人签名 2018.03.29 加入

还未添加个人简介

评论

发布
暂无评论
第九周.命题作业-GC原理