JVM GC 要点

对象存活判定算法

四种引用类型

1.强引用

2.弱引用

3.软引用

4.虚引用

a.引用计数法: 给对象中添加一个引用计数器 每当有一个地方引用它时,计算器值就加1

当引用失效时 计算器值就减1 任何时候计数器为0 的对象就是不可能被再使用的

然而在主流的Java虚拟机里未选用引用计数算法来管理内存,主要原因是它难以解决对象之间相互循环引用的问题,所以出现了另一种对象存活判定算法。

b.可达性分析法:通过一系列被称为『GC Roots』的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

可作为GC Roots的对象:

虚拟机栈中引用的对象,主要是指栈帧中的本地变量

本地方法栈中Native方法引用的对象

方法区中类静态属性引用的对象

方法区中常量引用的对象

垃圾收集算法

1.分代收集算法

根据对象存活周期的不同 将java堆分为新生代和老年代,并根据各个年代的特点 采用最适合的收集算法

新生代:大批对象死去,只有少量存活 使用复制算法 只需要复制少量存活对象即可。

老年代:对象存活率高。使用标记-清理算法或者标记-整理算法 只需要标记较少的回收对象即可。

2.复制算法

把可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用尽后,把还存活着的对象『复制』到另外一块上面,再将这一块内存空间一次清理掉。

优点:每次都是对整个半区进行内存回收,无需考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。

缺点:每次可使用的内存缩小为原来的一半,内存使用率低。

3.标记-清除算法

首先『标记』出所有需要回收的对象,然后统一『清除』所有被标记的对象。 是最基础的收集算法。

缺点:『标记』和『清除』过程的效率不高;空间碎片太多,『标记』『清除』之后会产生大量不连续的内存碎片,可能会导致后续需要分配较大对象时,因无法找到足够的连续内存而提前触发另一次GC,影响系统性能。 

 4.标记整理算法

首先『标记』出所有需要回收的对象,然后进行『整理』,使得存活的对象都向一端移动,最后直接清理掉端边界以外的内存。

优点:即没有浪费50%的空间,又不存在空间碎片问题,性价比较高。一般情况下,老年代会选择标记-整理算法。

你可能感兴趣的:(JVM GC 要点)