java垃圾回收机制

传统C 回收内存的任务时有步骤本身负责。步骤员可能造成忘记释放内存或错误释放核心类库所用的内存

java垃圾回收原理:每个对象的三种状态——可触及状态,可复活状态(finalize()方法),不可触及状态(垃圾回收期此时会真正回收它占用的内存),虽然步骤,可以调用System.gc()或者Runtime.gc()方法提示垃圾回收器尽快执行垃圾回收操作,但不能保证一定立即回收。

通常任何一种垃圾收集算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被步骤再次使用。

大多数垃圾回收算法使用了[color=red]根集[/color]这个概念,所谓根集就量正在执行的Jaudio-videoa步骤可以探望的引用变量的集合(包括局部变量、参数、类变量),根集可达的对象都是活动对象,不能作为垃圾被回收。

常用算法:
[b]1.引用计数法[/b]——不适用根集,使用引用计数器来区分存活对象和不再使用的对象。一般来说,[color=red]堆中每个对象对应一个引用计数器[/color],当每一次树立一个对象并赋值给一个变量时,引用计数器置为1,当对象被付给随意变量时,引用计数器每次加1.当退出作用域后,引用计数器减1,看看回收芯片,一档引用计数器为0,对象就满足了垃圾收集的条件。
速度快,适合实时的步骤,但给步骤执行带来了开销,每次赋值给新的引用,计数器加以,退出作用域时,计数器要减一。

[b]2.tracing算法[/b]——解决引用计数的问题,使用了根集,从根集开始扫描,识别出哪些对象可达,哪些对象不可达,用某种方式标记可达对象,例如对可达对象设置一个或多个位,在扫描识别的过程中,基于tracing算法的垃圾收集也称为标记和清除(mark-and-sweep)垃圾收集器

[b]3.compacting算法(压缩)[/b]——为了解决碎片问题,tracing吸收了compacting的思想,在回收过程中,算法将所有对象移到对的一端,堆的另一端就变成了相邻的空闲内存区,收集器对他移动的所有对象的所有引用进行更新,使得这些引用能够识别原来的对象。基于compacting算法的收集器实现中,一般增加句柄和句柄表。

[b]4.coping算法[/b]——该算法是为了解决碎片和句柄开销,在一开始,将内存分为一个对象面和多个空闲面,程序在对象面中分配对象内存,当对象面满了,基于coping算法的垃圾收集扫描根集,找出活动对象将其复制到空闲面,这样,使得活动对象之间就没有了空闲内存。对象面变成了空闲面。典型的就是stop-and-copy,在赋值过程中,程序停止运行。

[b]5.generation算法[/b]——coping算法因为要复制所有对象所以运行速度慢,利用对象多数生命周期短,少数存活时间长的特点,最开始将堆分成多个子堆,每个子堆作为对象的一代,随着程序丢弃不适用的对象,垃圾收集器将从最年轻的子堆中收集这些对象,在分代式的垃圾收集器运行后,上次存活下来的对象被复制到下一高代的子堆中,由于老一代的子堆不会经常被回收,因而节省了时间。

[b]6.adaptive 算法[/b]——在某些特定情况下,有些垃圾回收算法会优于其他算法,adaptive算法就的垃圾收集器就是监控当前堆的使用情况,并选择适当算法的垃圾收集器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值