Java垃圾回收器的工作机制

  Java垃圾回收器是一种“自适应的、分代的、停止—复制、标记-清扫”式的垃圾回收器。

  1、 在堆上分配对象的代价十分高昂,然而java的垃圾回收机制可以和其他语言从堆栈上分配空间的速度想媲美,但是,释放对上的存储空间也有开销;

  2、 当它工作的时候,将一面回收空间,一面使堆中的对象紧凑排列。这样就尽量避免了页面错误。通过垃圾回收器对对象重新排列,实现了一种高速的、有限空间可供分配的堆模型;

  3、 其他系统的垃圾回收机制:

  a、 引用计数是一种简单但速度很慢的垃圾回收计数。每个对象都含有一个引用计数器,当有引用链接至对象时,引用计数加1,当引用离开作用于或者被设置为null时,引用计数减1。缺陷:如果兑现之间存在循环引用,就会出现麻烦。

  b、 另一种思想:对任何“活”的对象,一定能够最终追溯到其存活在对战或静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。由此,如果从堆栈和静态存储区开始,遍历所有的引用,就能找到所有的的“活”的对象。

  4、 java的垃圾回收机制:

  a、 停止—复制(stop-and-copy):先暂停程序的运行,然后将所有存活的对象从当前堆复制到另一个堆,没有复制的全部都是垃圾。当对象被复制到新堆时,它们是一个挨着一个的,紧凑的。效率很低:首先,得有两个堆空间占用率200%;其次,垃圾较少时,复制大量的活着的对象,是很大的浪费。

  b、 标记—清扫(mark-and-sweep):从对战和静态存储区出发,遍历所有的引用,进而找出所有存活的对象,如果活着,就标记。只有全部标记完毕的时候,清理动作才开始。在清理的时候,没有标记的对象将会被释放,不会发生任何肤质动作。但是盛夏的对空间是不连续的,垃圾回收器要是希望得到连续空间的话,就得重新整理剩下的对象。

  c、 注意:“停止—复制”的意思是这种垃圾回收动作不是在后台进行的;相反,垃圾回收动作发生的同时,程序将会被暂停。有人将垃圾回收视为低优先级的后台进程,而事实上并不是这样,当可用内存数量比较低的时候,Sun版本的垃圾回收器就会暂停运行程序。同样,“标记-清扫”工作也必须在程序暂停的情况下才能进行。

  d、 在java虚拟机中,内存分配是以较大的块为单位的。每个块内都用相应的代数(generation count)来记录它是否还存活。代数随着引用的次数而增加。垃圾回收器将对上次回收动作之后的新分配的块进行整理。这对处理大量短命的临时对象很有帮助。垃圾回收器会定期进行完整的清理动作——大型对象仍然不会被复制(只是代数增加),内涵小型对象的那些块则被复制并整理。Java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记—清扫”方式;同样,java虚拟机会追踪“标记—清扫”的效果,要是堆空间出现很多碎片,就会切换到“停止—复制”方式。这就是“自适应”技术。

  总结:Java垃圾回收器是一种“自适应的、分代的、停止—复制、标记-清扫”式的垃圾回收器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值