概述
程序计数器,本地方法栈,虚拟机栈随线程而生,随线程而灭. Java堆和方法区则不一样,这部分内存分配和回收的都是动态的,垃圾收集器所关注的是这部分内存.
判断对象是否是垃圾的算法
JVM没有选用引用计数算法来管理内存,最主要的是引用计数很难解决对象之间相互循环引用的问题.JVM采用了可达性分析算法来判断对象是否能回收.用GC Roots对象作为起点,向下搜索,搜索走过的路劲称为引用链(reference chain),当对一个对象到GC Roots没有任何引用链时,则证明对象不可用的.
判定对象死亡
判定一个对象是否死亡,至少要经历2次标记.如果GC时,经过可达行分析对象不可用,将标记第一次并且进行第一次筛选,筛选条件是对象的finaliz()方法被覆盖且没有执行过.然后放入F-Queue队列中.第二次标记是对F-Queue队列,看对象是否在finalize()方法中拯救自己,否则进行回收.任何对象的finalize()方法都只会被系统自动调用一次,强烈不推荐使用finalize()方法.
垃圾回收算法
- 标记-清除算法
最基础的算法,其它算法是对它的完善和补充
- 复制算法
现在虚拟机都采用这种收集算法来回收新生代.
- 标记-整理算法
也可称标记-压缩算法.回收老年代采用了这种算法.
HotSpot的算法实现
- 枚举根节点
- 安全点停顿GC
- 安全区域GC
垃圾收集器
Serial收集器
Serial垃圾收集器是最基本,历史最悠久的收集器.
单线程GC,回收时”Stop the world”.采用复制算法.
对于运行Client模式下的虚拟机来说是一个不错的选择.
Serial Old收集器
Serial Old收集器是Serial的老年代版本.采用标记-整理算法.
ParNew收集器
Serial垃圾收集器
对于运行Server模式下的虚拟机来说是一个不错的选择.
Parallel Scavenge收集器
Parallel Scavenge收集器是新生代收集器,它采用复杂算法收集,又是并行的多线程收集器.
Parallel Scavenge收集器最主要目的是达到一个可控制的吞吐量.吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和”标记-整理”算法.
CMS收集器
CMS(Concurrent Mark Sweep)收集器是以一种获取最短回收停顿时间为目标的收集器.
4个步骤
- 初始标记(Stop the world)
- 并发标记
- 重新标记(Stop the world)
- 并发清除
G1收集器
并行和并发,分代收集,空间整合,可预测停顿.最前沿技术.