第九周. 命题作业 -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) 可预测的停顿。
评论