JVM垃圾回收器

垃圾回收算法

算法原理优点缺点
复制算法将内存划分为等大的两块区域,将区域1中保留的数据复制到区域2实现内存回收效率高易于实现内存利用率只有一半
大对象会被频繁回收
标记清除算法分两阶段执行,标记阶段将需要回收的数据做标记,在清除阶段回收被标记对象的内存空间清理效率高内存碎片
标记整理算法标记清除算法和复制算法的结合体,将回收完毕的对象整理到一块连续的内存空间避免了内存碎片,效率较高实现逻辑较复杂
分代收集算法根据对象存活周期将内存划分为年轻代、老年代、永久代然后指定不同的垃圾回收策略针对各类存活周期对象指定不同的垃圾回收策略

垃圾回收器

垃圾收集器关系

垃圾收集器工作原理特点适用场景
Serial单线程串行复制算法响应速度优先在client模式下运行的虚拟机,仅针对CPU资源紧张且无高吞吐需求的场景
ParNew多线程并行版本的Serial响应速度优先在server模式下运行的虚拟机,仅针对CPU资源紧张且无高吞吐需求的场景
parallel scavenge多线程并行复制算法高吞吐优先适用于后台运算而无太多交互的服务
Serial Old单线程串行标记整理算法响应速度优先在client模式下运行的虚拟机,仅针对CPU资源紧张且无高吞吐需求的场景
Parallel Old多线程并行标记整理算法高吞吐优先适用于后台运算而无太多交互的服务
CMS多线程并发标记清除算法响应速度优先适用于低延时频繁交互的场景
G1多线程并发、并行标记整理算法响应速度优先面向服务端应用

新生代和老年代的垃圾回收器如何搭配?

套吞吐VS低延时:两者在通常情况下是互斥的,因为高吞吐意味着我单次要尽可能多的将垃圾回收提供给用户线程更多可用空间,那么就意味着单次垃圾回收时长会变长。

  • 高吞吐:用户线程运行时长/(用户线程运行时长+垃圾收集时长)
  • 低延时:单次垃圾收集对用户线程运行造成的延时

结合不同垃圾回收器的特点来分析新生代和老年代应该如何搭配使用不同的垃圾回收器。

  • 高吞吐+高吞吐:parallel scavenge 和 parallel Old 都是高吞吐优先,天然适合搭配使用
  • 高吞吐+低延时:新生代选择高吞吐收集器,则新生代空闲空间会长时间维持在一个较低水位,当申明较大对象时会因为空间不够而直接放入老年代,但是老年代又是低延时收集器,可能造成的现象就是低频youngGC+高配fullGC,显然不是我们所希望的。parallel scavenge+serial old的搭配不推荐使用。
  • 低延时+低延时:serial+CMS, serial+serial Old,parNew+CMS,parNew+serial Old
  • 低延时+高吞吐:理论上可以这么搭配,但是会把两者的短处都放大,而且基于历史原因serial、serial Old,parNew和CMS是一个代码框架,parallel scavenge和parallel Old是一个代码框架,官方也不支持这用搭配。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值