说一说JVM垃圾回收算法

闲聊

说到垃圾回收算法,首先要聊的就是JVM如何判断一个对象为垃圾。

流程其实就是用的GCRoot一个节点去判断是否可以找到该类,(可达性分析)。

收集算法

标记清理

简单粗暴地清理方式,打上标记,然后清理。当然这么做有个坏处,就是会有大量的内存碎片,(内存碎片的坏处,像是大数组,大对象,什么的内存地址要逻辑连续,内存碎片可能太小不够分)

标记整理

根据标记清理的问题,弄出了个标记整理算法,就是我清完了之后我再整理一下,把占用的内存都移到前面去,这样就没有内存碎片了,但这也有坏处,有点消耗性能,一次性需要标记的有点多,而且还要整理,这就造成了gc时间过长。

复制

针对标记整理的问题,想到了可以边清边移,这样整个内存只需要跑一次,但这有一个问题,就是如何保证移的时候前面就没有内存碎片?于是想到了先把内存分两片,一片空的,一片是在使用的,每次清理的时候,就把没清掉的按顺序放到空的内存片上,这样就保证了内存连续,但这有一个更严重的问题,众所周知,内存比硬盘要贵,按照这种方式去收集,因为要保持一半是空的,实际工作的只有一半的内存,这样一下浪费了一半的内存,直接好家伙。

分代收集

根据上面种种的问题,只能采取一个比较中庸的方式。我们可以根据不同的地方的特点来用不同的收集算法,

比如新生代,这个地方老是要gc拿就用复制算法,有人会说那这多浪费内存啊。只能说并不会,一个最大的原因,新生代小啊。

老年代就标记整理,反正一般能活着到达老年代的对象一般也不清理。所以这里对效率要求也不是那么高了。

结尾闲聊(关于收集器相关部分)

说到回收算法,就得说一下回收算法和收集器的关系了,简单来说收集器就是使用回收算法来回收垃圾,上面也提到了分代收集的思想,JVM内存模型里,堆内存也是分代的。

比如新生代和老年代。

新生代采用复制算法,(新生代分为伊甸园,和幸存区from,和幸存区to,他们之间的内存比是8:1:1,复制的时候是从伊甸园和幸存区from将存活下来的对象复制到幸存区to中,然后将from和to的身份互换,{这里有需要的话,我可以画张图})

垃圾收集器的话有很多种,而且这东西的选用和版本还有虚拟机类型有关,所以不单说,知道算法基本都用的是复制算法就行。当然很多收集器的优化基本都是对新生代进行优化,毕竟这里清理要更加的频繁。一旦有优化性能提升也比较大。

老年代采用的标记整理,(这里没啥分区基本活过15次或者是大对象,大数组啥的,都在这里) 这里一般也不清理,收集器的话,暂时不提了。

 

 

如有错误请指出!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值