JAVA - 垃圾回收

(1)什么是垃圾?为什么要使用垃圾回收器?

没有对象的引用指向原先分配给某个对象的内存,那么这块内存就是垃圾。

使用垃圾回收器有两个优点:一是可以使程序开发人员从释放内存这个重担中解救出来,提高了开发效率,因为,在一种没有垃圾回收器的语言中,需要花很多时间在释放内存上;二是能够保持程序的完整性,垃圾回收也是JAVA安全策略的一部分,不会因为程序员错误的释放内存而导致JAVA虚拟机的崩溃。

当然,垃圾回收器也有缺点,那就是增大了程序的开销,因为需要跟踪每个对象的引用。

垃圾回收算法需要做的事情:一是发现垃圾,二是回收垃圾。


(2)常用算法:引用计数法,跟踪法,压缩收集器,拷贝收集器

引用计数法,堆中的每个对象对应一个计数器,当有新的引用指向它时,计数器加一,当有引用超出作用域时,计数器减一,当计数器为零时,具备回收条件。缺点:增大了开销,对象的赋值操作都会引起计数器的操作,而且不能处循环的情况,如父对象有一个对子对象的引用,而子对象又有一个对父对象的引用,这种情况引用计数永远都不会为0。

跟踪收集器方法,跟踪从根结点开始的对象引用图,在跟踪过程中,能够遍历到的标记出来,如果遍历整个图,不能到达的对象就是垃圾对象。

压缩收集器,标记并清除收集器通常使用的两种策略是压缩和拷贝。这两种方法都是快速地移动对象减少堆碎块。压缩收集器把活动的对象越过空闲区滑动到堆的一端,在这个过程中,堆的另一端出现一个大的连续空闲区。所有被移动的对象的引用也被更新,指向新的位置。

拷贝收集器,把所有的活动对象移动到一个新的区域。在拷贝的过程中,它们被紧挨着布置,所以,可以消除原本它们在旧区域的空隙。原有的区域被认为都是空闲区。这种方法的好处是对象可以在从根对象开始的遍历过程中随着发现而被拷贝,不再有标记和清除的区分。
一般的拷贝收集器算法被称为“停止并拷贝”。在这个方案中,堆被分为两个区域,任何时候都只使用其中的一个区域。对象在同一个区域中分配,直到这个区域被耗尽。此时,程序执行中止,堆被遍历,遍历时遇到活动对象就拷贝到另外一个区域。当停止和拷贝过程结束时,程序恢复执行。内存将从新的区域中分配,直到它也被用尽。缺点是,每次垃圾收集的时候,都需要把所有的活动对象拷贝一次。

按代收集的回收器,停止并拷贝的缺点是每次收集都需要把所有的活动对象都拷贝一次,按代收集可以缓解这个缺点,因为“大多数程序创建的大部分对象都具有很短的生命期,比如局部变量”,“大多数程序都创建一些具有非常长生命周期的对象,如全局变量”。
按代收集的收集器通过把对象按照寿命来分组解决这个“停止拷贝”效率低下的问题。在按代收集的方法中,堆被分成两个或者更多的子堆,每一个子堆为一“代”对象服务,最年幼的那一代进行最频繁的垃圾收集。因为大多数对象都是短促出现的,只有很小部分的年幼对象可以在它们经历第一次收集后还存活。如果一个年幼的对象经历了好几次垃圾收集后仍然存活,那么这个对象就成长为寿命更高的一代。

自适应收集器,没有固定的收集方法,根据实际情况选择合适的收集方法。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值