垃圾收集器与内存分配策略

来源:互联网 发布:js中string转list 编辑:程序博客网 时间:2024/06/06 20:18

判断对象是否存活

引用计数算法

给对象添加一个引用计数器,每当被引用时,计数器值加1,当引用失效时,计数器值减1.为0时则没有被引用
难以解决对象之间相互循环使用的问题

objA.instance = objB;objB.instance = objA;objA = null;objB = null;

可达性分析算法

通过一系列称为”GC Roots”的对象作为起始点,向下搜索,走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,可回收

垃圾收集算法

标记-清除算法(Mark-Sweep)

先标记后清除
存在效率问题和空间问题

复制算法

将可用内存容量划分为大小相等的两块,每次使用其中一块,用完后复制存活对象到另一块,然后全部清除正在使用的内存块

标记-整理算法

让所有存活的对象都向一端移动,然后直接清理掉端边界外的内存

分代收集算法

根据存活周期的不同将内存划分为几块
新生代对象存活率低,复制算法
老年代对象存活率高,”标记-清理”或”标记-整理”算法

垃圾收集器

Serial收集器

单线程收集器,简单而高效

ParNew收集器

多线程收集

Parallel Scavenge收集器

新生代收集器,使用复制算法
目标是达到一个可控制的吞吐量,”吞吐量优先”
不能与CMS收集器配合使用

Serial Old收集器

Serial收集器的老年代版本

Parallel Old收集器

Parallel Scavenge收集器的老年代版本,

CMS收集器(Concurrent Mark Sweep)

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

G1收集器(Garbage-First)

每次根据允许的收集时间,优先回收价值最大的Region
新生代和老年代

内存分配与回收策略

  • 对象优先在Eden分配
  • 大对象直接进入老年代
  • 长期存活的对象将进入老年代

新生代GC (Minor GC):发生在新生代的垃圾收集动作,速度快

老年代GC (Major GC/ Full GC):发生在老年代的GC,速度慢

原创粉丝点击