Java虚拟机垃圾收集

 

什么是根对象:

         Java虚拟机的根对象集合根据实现不同而不同,但是总会包含局部变量中的对象引用和栈帧的操作数栈(以及变量中的对象引用)。

根对象的来源之一是被加载的类的常量池中的对象引用,比如字符串。被加载的类的常量池可能指向保存在堆中的字符串,比如类名字,超类名字,超接口名字,字段名,字段特征签名,方法名或者方法特征签名。

来源之二是传到本地方法中,没有被本地方法“释放”的对象引用。

来源之三是虚拟机运行时数据区中从垃圾收集器的堆中分配的部分。

1.       引用集数法

堆中的每一个对象都有一个引用计数。当一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对象的引用计数被置为1。当任何其他变量被赋值为对这个对象的引用时,计数加1.当一个对象的引用超过了生存器或者被设置一个新的值时,对象引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。

优点:引用计数器很快执行,交织在程序运行之中。

缺点:无法检测出循环(两个或者更多对象互相引用)

 

2.       跟踪收集器(标记并清除)

从根节点开始的对象引用图,在追踪过程中遇到的对象以某种方式打上标记。当追踪结束时,未被标记的对象就是不可达,从而被收集。

 

3.       压缩收集器

把活动的对象越过空闲区滑动到堆的一端,在这个过程中,堆的另一端出现一个大的连续空闲区。所有被移动的对象引用更新,指向新的位置。

 

4.       拷贝收集器

拷贝垃圾收集器把所有的活动对象移动到一个新的区域。在拷贝的过程中,他们被紧挨这布置。好处是对象可以在从根对象开始的遍历过程中随着发现而被拷贝,不再有标记和清除的区分。

 

5.       按代收集的收集器

通过把对象按照寿命来分组,堆被划分成两个或多个子堆,每一个子堆为一“代”对象服务。最年幼的那一代进行最频繁的垃圾回收,大多数对象都是短促出现,少部分存活,被放到年龄更告的一代。

 

6.       自适应收集器

自动调整垃圾回收策略。

 

7.       火车算法

5中所述垃圾收集器中,最成熟代使用火车算法回收垃圾。其特点无法给定最多尺寸,因为,任何其他年龄层不再适合的对象总要有个去处。

 

火车算法把成熟对象空间划分为固定长度的内存块,每次在一个块中单独执行。

垃圾收集算法一个很大的缺点就是难以控制垃圾回收所占用的CPU时间,以及何时需要进行垃圾回收。火车算法是分代收集器所用的算法,目的是在成熟对象空间中提供限定时间的渐进收集。目前应用于SUN公司的Hotspot虚拟机上。

           在火车算法中,内存被分为块,多个块组成一个集合。为了形象化,一节车厢代表一个块,一列火车代表一个集合,见图一

 

 

图一

注意每个车厢大小相等,但每个火车包含的车厢数不一定相等。垃圾收集以车厢为单位,收集顺序依次为1.11.21.31.42.12.22.33.13.23.3。这个顺序也是块被创建的先后顺序。

垃圾收集器先从块1.1开始扫描直到1.4,如果火车1四个块中的所有对象没有被火车2和火车3的对象引用,而只有火车1内部的对象相互引用,则整个火车1都是垃圾,可以被回收。

如图二,车厢1.1中有对象A和对象B1.3中有对象C1.4中有对象D,车厢2.2中有对象E,车厢3.3中有对象F。在火车1中,对象C引用对象A,对象B引用对象D,可见,火车2和火车3没有引用火车1的对象,则整个火车1都是垃圾。

 

 

 

图二

如果火车1中有对象被其它火车引用,见图三,扫描车厢1.1时发现对象A被火车2中的E引用,则将对象A从车厢1.1转移到车厢2.2,然后扫描A引用的对象D,把D也转移到车厢2.2,然后扫描D,看D是否引用其它对象,如果引用了其它对象则也要转移,依次类推。扫描完火车1的所有对象后,剩下的没有转移的对象都是垃圾,可以把整个火车1都作为垃圾回收。注意如果在转移时,如果车厢2.2空间满了,则要在火车2末尾开辟新的车厢2.4,将新转移的对象都放到2.4,即火车的尾部)

 

 

 

图三

     补充说明:垃圾回收器一次只扫描一个车厢。图三中的对象BC并不是立即被回收,而是先会被转移到火车1的尾部车厢。即扫描完1.1后,B被转移到火车1尾部,扫描完1.3后,C被转移到车尾。等垃圾收集器扫描到火车1尾部时,如果仍然没有外部对象引用它们,则BC会被收集。

     火车算法最大的好处是它可以保证大的循环结构可以被完全收集,因为成为垃圾的循环结构中的对象,无论多大,都会被移入同一列火车,最终一起被收集。还有一个好处是这种算法在大多数情况下可以保证一次垃圾收集所耗时间在一定限度之内,因为一次垃圾回收只收集一个车厢,而车厢的大小是有限度的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值