Java虚拟机的GC算法:标记-清除与复制

createh54周前 (04-07)技术教程5

Java虚拟机的GC算法:标记-清除与复制

在Java编程的世界里,垃 圾回收(Garbage Collection, GC)就像是一位默默工作的园丁,它清理着程序运行过程中不再需要的对象,为新生对象腾出空间。今天,咱们就来聊聊Java虚拟机(JVM)中最经典的两种GC算法:标记-清除算法和复制算法。这两位“园丁”各有千秋,它们的工作方式和适用场景都值得我们好好研究一番。

标记-清除算法:简单直接的“清理工”

标记-清除算法是一种最基础的垃 圾回收方法。它的运作方式非常直观:首先,“标记”阶段,垃 圾回收器会遍历所有的活动对象,给它们打上“存活”的标签;然后,在“清除”阶段,垃 圾回收器会释放那些没有被打上标签的对象所占用的空间。

优点:

  1. 实现简单:这种算法的设计思路非常直接,只需要简单的遍历和标记操作。
  2. 无需内存整理:它不需要像其他一些算法那样对内存进行重新整理,这样可以减少额外的开销。

缺点:

  1. 碎片化问题:由于只进行标记和清除,而不进行内存整理,随着时间推移,内存可能会变得零散不堪,影响后续的内存分配效率。
  2. 性能波动:在“清除”阶段,垃 圾回收器需要处理大量的非活动对象,这可能会导致系统性能的突然下降。

复制算法:分而治之的“搬家工”

如果说标记-清除算法是一位“清理工”,那么复制算法就是一个“搬家工”。它将内存分为两个区域,一个用于存放活动对象,另一个作为备用区。当某个区域的活动对象数量超过一定阈值时,垃 圾回收器会将这些对象移动到另一个区域,并清空原来的区域。

优点:

  1. 消除碎片:通过这种方式,内存中的对象总是连续存储的,避免了碎片化问题。
  2. 高效回收:由于只涉及少量对象的复制,因此回收过程通常比较快速且稳定。

缺点:

  1. 内存使用率低:为了保证有足够的备用区域,内存的使用效率只有50%左右。
  2. 高初始成本:在开始阶段,需要较大的内存支持,这对于资源受限的环境可能不太友好。

实战小剧场:标记-清除与复制算法的对决

假设你正在编写一款手机游戏,游戏中有大量的动态元素(比如子弹、特效等)。这些元素在屏幕上的存在时间很短,一旦消失,就应该被立即回收以节省内存。在这种情况下:

  • 如果选择标记-清除算法,虽然初期实现简单,但随着游戏运行时间的增加,内存碎片会逐渐增多,可能导致偶尔出现卡顿现象。
  • 如果选择复制算法,则可以很好地应对这种情况,因为新生成的对象总是存储在一块连续的内存中,减少了查找和分配内存的时间。

当然,实际开发中往往不会单纯依赖某一种算法,而是根据具体需求结合多种算法的优点,设计出更高效的垃 圾回收策略。

总结

无论是标记-清除还是复制算法,它们都是垃 圾回收家族中的重要成员。标记-清除算法以其简洁直接著称,而复制算法则以高效有序取胜。了解这两种算法的特点和应用场景,对于提升Java应用程序的性能至关重要。希望今天的讲解能让你对这两名“园丁”的工作方式有一个更深刻的理解。如果你对它们的应用还有疑问,不妨动手试试,看看它们在你的代码世界里能擦出怎样的火花!

相关文章

如何简单实现内网穿透(Java)

背景有时我们想在公司远程自己电脑,或者本地部署的模型给外部访问,还有一些微信、QQ的回调测试,我们都是想要外部能够访问得到,这时候你可能需要内网穿透来实现,虽然内网穿透工具有很多了,但是有很多限制,配...

面试必备之对象拷贝神器

BeanUtils.copyProperties vs BeanCopier:谁才是Java界的“复制粘贴之王”?1. 开篇:Java界的“复制粘贴”江湖在Java的世界里,对象的复制粘贴(属性拷贝)...

不要网上乱拷贝代码了!一段网上找的代码突然炸了!

作者:陈宏鸿 https://www.cnblogs.com/aspwebchh/p/12220673.html碰到一个需求,给服某些要求的玩家的发送道具奖励,奖励的数量根据离线的天数计算。这个需求实...

正确复制、重写别人的代码,不算抄袭

我最近在一篇文章提到,工程师应该怎样避免使用大量的库、包以及其他依赖关系。我建议的另一种方案是,如果你没有达到重用第三方代码的阈值时,那么你就可以自己编写代码。在本文中,我将讨论一个在重用和从头开始编...

零拷贝技术——让数据传输效率飙升的底层“黑科技”

零拷贝技术——让数据传输效率飙升的底层“黑科技”一、从“快递员拆箱”到零拷贝:数据传输为何需要革命?想象一下,你网购的商品从仓库到你家,要经历仓库→物流中心→快递员→你家。如果每个环节都要拆箱检查再打...