垃圾回收的算法和思想

看了JAVA程序性能优化这本书的垃圾回收内容章节后整理归纳。

第一种:引用计数法
实现:对于一个对象A,只要任何一个对象引用了A,那么A的引用计数器就加1,当引用失效时,引用计数器就减1。只要引用计数器的值为0,那么就表示对象A不可能再被引用。
好处:使用古老,容易实现;
坏处:当循环引用的时候,容易导致内存泄露问题;A引用了B,B也引用了A,这样始终不会释放,导致内存泄露(不可达的对象)。

第二种:标记-清除算法
实现:分为两个阶段,标记阶段和清除阶段。在标记阶段,从根节点开始,对每一个可达性的对象进行标记,没有被标记的的对象,在第二个阶段,将会被清除。
好处:分层清晰,是现代垃圾回收算法的思想基础;
坏处:清除的时候,会产生很多时间碎片,大对象无法存放,出现很多不连续的空间,影响效率(我们知道,不连续的内存空间的工作效率要低于连续的空间);

第三种:复制算法
实现:将原有的内存空间分为2块,每次只使用一块,在垃圾回收的时候,将正在使用的内存中的存活的对象复制到另外未使用的内存块中,之后清除掉正在使用的内存块中的所有的对象,交换2个内存的角色。
好处:对于垃圾比较多的对象,效率很高;因为是复制到另外的内存里面的,所以空间是连续的;
坏处:对于存活对象很久的对象,会浪费性能;

注:因为JVM堆中的年轻代中大部分都是垃圾的对象,所以采用此复制算法来实现效率更高。

第四种:标记-压缩算法
实现:在标记阶段和标记-清除算法类似,都是先从根节点标记可达性的对象,只是在第二个阶段,需要对所有可达性的对象进行压缩,压缩到内存一端,之后,清理掉边界外的所有的空间。
好处:内存空间是连续的,避免的碎片的产生,性价比比较高;

注:比较适用于老年代的一种回收算法,因为老年代大部分都是长期存活的对象,不需要被回收的。

第五种:增量算法
实现:因为在GC运行的时候,所有的应用程序都是需要停下来的,这样如果回收的时间比较长,会出现卡顿的情况,影响用户体验;这时候可以采用增量的算法,每次针对一小块的内存区域进行垃圾回收,然后再自行一会儿线程,如此交换运行,直到GC清理完成。
好处:优化客户体验,减少卡顿产生;
坏处:因为GC和线程之间需要不断的切换,上下文的转换需要消耗资源,使得垃圾回收的成本上升了,降低了系统的吞吐量;

第六种:分代
实现:分代是一种思想,在垃圾回收的过程中,我们没办法一直采用一种算法来进行垃圾回收,每种垃圾回收算法都有自己独特的优点和特点,因此可以采用几种算法来进行。
以hotspot为例,年轻代采用的是复制算法,老年代采用的是标记-压缩算法,提高了垃圾回收的效率。

原文:https://gper.club/articles/7e7e7f7ff7g5cgc2g68

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值