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

2017-10-28  本文已影响64人  鲁云飞_

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

image.png image.png

对象已死吗

<font color=red>垃圾收集器在对堆回收前,要确定哪些对象还存活,哪些对象已死去</font>

引用计数法

可达性分析算法

引用

引用 说明 举例
强引用 垃圾收集器<font color=red>永远不会回收</font>强引用的对象 Object obj = new Object()
软引用 <font color=red>OutOfMemory异常前</font>回收
弱引用 <font color=red>下次垃圾收集发生前</font>回收
虚引用 唯一目的是对象被收集器回收时收到一个系统通知.
不会对对象生存时间构成影响, 也无法通过虚引用获得对象的实例
-

垃圾收集算法

标记-清除算法

标记-整理算法

- 标记过程 回收过程
标记-清除算法 先按可达性算法标记出所有需要回收的对象 直接对可回收对象进行清理
标记-整理算法 同上 让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

复制算法

分代收集算法

分代收集算法

垃圾收集器

Serial 收集器

ParNew 收集器

Parallel Scavenge 收集器

收集器 关注点 适合
CMS等其他收集器 尽可能缩短垃圾收集时用户线程的停顿时间
Parallel Scavenge 达到可控制的吞吐量 停顿时间越短,越适合用户交互程序|高吞吐量可高效利用CPU时间,尽快完成程序运算任务,适合后台运算而不需要太多交互的任务

Serial Old 收集器

Parallel Old 收集器

收集器 线程 年代 关注点
Serial 单线程 新生代 关注用户线程的停顿时间
Serial Old 单线程 老年代 关注用户线程的停顿时间
ParNew 多线程 新生代 关注用户线程的停顿时间
Parallel Scavenge 多线程 新生代 <font color=red>关注吞吐量</font>
Parallel Old 多线程 老年代 <font color=red>关注吞吐量</font>
CMS 多线程 老年代 关注用户线程的停顿时间

CMS收集器

|阶段序号|阶段|描述|速度|Stop The World|(非并行)|
|----|----|----|----|
|1|初始标记|仅仅只是标记一下能直接关联到对象的GC Roots|很快|是|否|
|2|并发标记|GC Roots Tracing的过程,标记GC链中的对象|很快|否|是|
|3|重新标记|修正并发标记期间因用户程序继续运作而导致标记产生变动的那部分对象的标记记录|初始标记<重新标记<并发标记|是|是|
|4|并发清除||耗时较长|否|是|

G1收集器

阶段序号 阶段 描述 速度 Stop The World 并发执行(非并行)
1 初始标记 仅仅只是标记一下能直接关联到对象的GC Roots 很快
2 并发标记 GC Roots Tracing的过程,标记GC链中的对象 很快
3 最终标记 修正并发标记期间因用户程序继续运作而导致标记产生变动的那部分对象的标记记录 初始标记<重新标记<并发标记 可并行
4 筛选回收 对各Region回收价值和成本进行排序,根据用户所期望的GC停顿时间来指定回收计划 耗时用户可控制

内存分配与回收策略

上一篇 下一篇

猜你喜欢

热点阅读