Java GC回收机制是怎么回事?

一、如何定义垃圾

        Java作为主流的编程语言与它的GC回收机制也是脱不了干系。相比C需要自己开辟空间、回收空间。Java大大的提高了开发效率,让程序员不必将精力放在代码之外的事上。

        那么我们如何定义一个对象是不是“垃圾”呢?

        最早的话是用一种计数法。也就是在堆中有一个类似计数器的东西来判断这个堆中的对象是否还有没有人引用。如果计数器清零,则判断为此对象是无用的了,可以回收清除了。

         计数器法就类似这种,听其他大佬说python依然沿用这种回收机制。但是Java可能会出现对象间的互相引用,用这种方法就不行了。

         比如下图:

 可能比喻的不是很恰当,但道理是这样的。

        后来意识到这个问题后就出现了我们的寻根法,根据对象一直往下找,找到最底层有没有栈对象引用。

二、如今GC主流的三种回收算法

        到后面我们的伊甸园、老年代也是基于这三种。

        1、标记清除

        这是最基础的回收算法,它是先通过寻根法找到没用的“垃圾对象”后,并进行一个标记。随后在清楚阶段。进行回收。

        缺点:这个算法虽然简单。但是会导致内存空间零散稀疏。导致我们再存入大对象的时候就会触发垃圾回收机制。如图:

         2、copying算法

        这种算法简单高效。且不会产生内存碎片。但是是用极大的内存空间换来的。因为我们能够使用的内存空间仅仅是copying区的一半。copying区可能有些词不达意。就说他是新生代中的Survivor空间吧。

        它会将我们的内存空间一分为二,一次只使用半边。回收机制是将有用的对象直接转移到另一半,然后清空这一半内存空间(也是垃圾对象)。

         3、标签整理

               这种算法与标签删除算法类似,不过是在清楚垃圾对象前,会将有用的对象往一端移动。就完成了垃圾回收机制,也保存了连续、干净的内存空间。

        缺点:比较花费算力,对cpu、时间上不太友好 。

 

        最终JVM垃圾回收机制整合了以上三种算法。创建了分代算法。

三、分代算法(伊甸园新生代+老年代)

        分代算法的优点,它会根据每个分代区的特性执行不同的垃圾回收算法。

       当我们创建一个新的对象(不包括大对象:如很大的字符串等),都会分配到我们的新生代。因为新生代对象更新迭代较快。所以使用的较快的标记删除和copying算法。而老年代对象都是些大对象和常用对象。所以gc频率会低很多。就使用标记整理算法。既不会过于浪费性能、也保证了内存的连续完整性,可以存放更多对象,也不会频繁触发gc。

         这就是分代算法内存空间大概分配。我们现在来模拟一个小对象(object01),在一直使用的条件下,在内存空间被分配的活动轨迹。

         Survivor区使用copying算法。它同时还添加了一种年龄机制。当你的对象在Survivor区存活了多次后,就认定你的对象是常用不需要释放的对象。就会给你丢到老年代进行管理。

四、垃圾收集器的版本迭代

        最早的垃圾回收器是单线程的。当我们进行垃圾回收机制的时候,所有的线程、代码都得停下来。也就是STW (stop the world :世界停止)

        现在也都多线程了。实际根据自己JDK版本默认。也可以自己去修改选择那种垃圾回收器。

也是JVM调优中的了。

扩展讨论:

        JVM调优是面试中一个比较高频,也是用人单位招聘信息上长写的。比如:你有jvm调优经验吗?有jvm调优者优先。但是我这么长时间都感觉没碰到需要手动去修改JVM配置的。无非是项目部署时根据服务器的情况分配空间。

        感觉如果代码调优(少创建不必要的对象,少创建大对象)、再时框架调优。真的很少碰到需要JVM调优,可能是我进的公司都比较小。有好用、常用的jvm调优可以在评论下@我下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值