Java - 垃圾回收算法与垃圾回收器

垃圾回收算法

1. 标记-清除

  • 过程:标记所有需要回收的对象,标记结束后,回收所有被标记的对象
  • 缺点:效率低下,容易造成碎片

2. 复制

  • 将内存空间分为两部分,每次只使用一部分,当一部分用尽,则将其所有对象复制到另一部分,并清理自身
  • 特点:不产生碎片,但造成空间浪费
  • 老年代将内存分为一个Eden 和两个Survivor,每次使用一个Eden 和一个Survivor,回收时,将存活的对象复制到另一个Survivor,当待复制对象大于另一个Survivor 时,老年代进行担保

3. 标记-整理

  • 标记之后,将所有存活的对象移向另一端,清理其他对象
  • 优点:解决了对象存活率高时,复制对象的压力

4. 分代收集

根据年轻代[ 1, 2]、老年代[ 3]各自的特点,采用不同回收算法

垃圾回收器

Serial

单线程,在进行GC 时,需要停止其他的所有线程

ParNew

Serial 的多线程版本。但是在单线程环境下,由于线程开销较大,效果不如Serial。但随着CPU 的增加,便可以显现出优势,默认线程数等于 CPU数。

Parallel Scavenge

多线程。可设置 1. 吞吐量(cpu 运行100分钟,GC 使用1分钟,Throughput = 99%),2. 最大GC 停顿时间(缩小GC 停顿时间,要以牺牲吞吐量和增加GC 频率为代价)

年轻代与老年代的分界线

Serial Old

Serial 的老年代版本

CMS

获取最短GC 停顿时间。基于标记-清除算法。
  • 初始阶段:主要负责标记GC Root能直接关联的对象,速度快。
  • 并发标记:从GC Root 开始继续向下标记,耗时。
  • 重新标记:统计在并发标记过程中发生变化的标记,时间长于 初始阶段但小于 并发标记。
  • 并发清除:清除老年代中的垃圾,耗时。
缺点:
  • 产生碎片
  • 浮动垃圾
  • 对cpu 敏感

G1

可同时应用于年轻代和年老代的GC 器。基于标记-整理算法。使用时,堆内存布局发生变化,将堆分成性质不同的但大小相同的region,用以避免全局GC,建立可预测的停顿时间模型。每个 region对应一个 remembered set,当对象处于不同region,remember set 会进行记录,即可保证不进行全局GC,也不会遗漏。
  • 初始标记
  • 并发标记
  • 最终标记:将并发标记过程中发生变化的对象写入线程remember set log,同时与remembered set 合并
  • 筛选回收:通过比较region 的回收成本与价值,得到一个最好的回收方案

parallel old

老年代。标记-整理。吞吐量优先。

GC 时,程序逻辑是否继续执行?

Serial、parnew 等=> stop the world
CMS、G1 => 非并发阶段,程序逻辑继续执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PeersLee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值