JVM垃圾收集器总结

对象存活or死亡判定算法

  • 引用计数法:在对象中添加一个引用计数器,每当有一个地方引用它时,计数值就加一,当引用失效,计数值就减一。任何时刻计数器为零的对象就是不会再被使用的对象,此时判定对象为死亡
  • 可达性分析法:设置一系列GC Roots根对象作为其实节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为”引用链“,如果某个对象对GC Roots间没有任何引用链相连,则称此对象是不可达,即可判定对象死亡

垃圾回收算法

  • 标记-清除:先扫描一遍堆中的对象,标记出可以清除的对象,再统一清理(适用于老年代)
  • 标记-复制:先扫描一遍堆中的对象,标记处可以清除的对象,将存活的对象复制到新的内存空间中,再统一清理死亡对象(使用于新生代,因为新生代中的存活对象较少,复制对象所需的成本比较低)注:堆内存区一般被分为新生代区和老年代区,而新生代区又被一块较大的Eden空间和两块较小的Survivior空间,这样分配是为了方便实现并优化标记-复制算法。
  • 标记-整理:先扫描一遍堆中的对象,标记出可以清除的对象,让存活的对象都向内存空间一端移动,然后清除掉边界以外的内存。标记-整理算法是标记-清除算法的进阶,目的是避免大量内存碎片的产生(使用于老年代)

经典垃圾收集器概要

Serial收集器:新生代垃圾收集器;工作时,必须暂停其他所有工作进程,只用一条线程进行工作;采用标记-复制算法;适用于运行在客户端模式下的虚拟机

特点:简单高效

Serial Old收集器:Serial收集器的老年代版本;工作时,必须暂停其他所有工作进程,只用一条线程进行工作;采用标记-整理算法

ParNew收集器:Serial收集器的多线程并行版本;新生代垃圾收集器;工作时,必须暂停其他所有工作进程;采用标记-复制算法

适用于运行在服务端模式下的虚拟机,几乎快被淘汰

Parallel Scavenge收集器:新生代垃圾收集器;工作时,必须暂停其他所有工作进程,多线程并发收集;采用标记-复制算法

特点:关注吞吐量,也被称为“吞吐量优先收集器”,用户可以通过参数设置内存回收花费的时间

吞吐量 = 运行用户代码时间/(运行用户代码时间+运行垃圾收集时间)

Parallel Old收集器:Parallel Scavenge收集器的老年代版本;多线程并发收集,工作时必须暂停其他所有工作进程;采用标记-整理算法

CMS(Concurrent Mark Sweep)收集器:基于标记-清除算法;

收集过程分为以下四个步骤:

  • 初始标记:标记GC Roots能直接关联到的对象,需要暂停用户线程
  • 并发标记:遍历整个对象图,耗时长,和用户线程并发执行
  • 重新标记:采用增量更新算法重新标记并发执行过程中产生变动的对象采用增量更新算法,需要暂停用户线程
  • 并发清除:清理删除掉标记阶段判断死亡的对象,和用户线程并发执行

缺点:

  • 对处理器资源非常敏感。在并发阶段,回收过程会占用部分线程,导致应用程序变慢,降低吞吐量,当处理器核心小于4个时,对用户程序的影响可能会变得很大
  • 无法处理“浮动垃圾”。在CMS的并发标记和并发清理阶段,用户线程仍在继续运行,即会有新的对象不断产生,这一部分的垃圾对象是在标记过程结束后,CMS无法在当此回收过程中处理掉它们,只好留到下一次垃圾收集时再处理。这一部分垃圾就成为“浮动垃圾”
  • 会有大量空间碎片产生。原因:采用了标记-清除算法。当内存空间过于碎片化无法为大对象分配内存空间时,就会触发一次Full GC


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值