虚拟机算法

一、对象存活判定算法
1、引用计数算法
每个对象都有一个引用计数器,当有一个地方引用它时,计数器加1,当引用失效时,计数器减1;任何时刻计数器为0的对象就不可能再被引用了。
优点:判断效率高
缺点:很难解决对象之间相互循环引用的问题
2、可达性分析算法
通过一系列成为“GC Roots”的对象作为起点,从这些节点往下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(看图中,object5,object6,object7是不可达的),则证明该对象是不可用的,但此时,该对象并不是非死不可,而是进入死缓阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Root s相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会放置在一个叫做F-Queue的队列之中,并在稍后由一个由虚拟机自动建立的、低优先级的Finalizer线程去执行它。这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束,这样做
的原因是,如果一个对象在finalize()方法中执行缓慢,或者发生了死循环(更极端的情
况),将很可能会导致F-Qu eu e队列中其他对象永久处于等待,甚至导致整个内存回收系统
崩溃。finaliza()方法是对象逃脱死亡命运的最后一次机会,稍后GC将对F-Qu eu e中的对象
进行第二次小规模的标记,如果对象要在finalize()中成功拯救自己——只要重新与引用链
上的任何一个对象建立关联即可,譬如把自己(this关键字)赋值给某个类变量或者对象的
成员变量,那在第二次标记时它将被移除出“即将回收”的集合;如果对象这时候还没有逃

脱,那基本上它就真的被回收了。



GC Roots的对象包括:
虚拟机栈(栈帧中的本地变量表)中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法区栈中JNI(即Native方法)引用的对象
二、垃圾收集算法
3、标记--清除算法
先标记需要回收的对象,然后进行统一回收
缺点:标记和清除的效率都不是很高,而且容易产生不连续的内存碎片,碎片太多,在分配较大对象是可能就会导致无法分配,又需要再次触发垃圾收集动作。
4、复制算法
将内存按容量划分为大小相等的两块,每次只是是用其中一块
新生代的虚拟机都不是换分为两块了,而是划分为Eden空间和两块Survivor空间,每次是用Eden空间和一块Survivor,将Eden 和Su rvivor中还存活着的对象一次性地复制到另外一块Su rvivor空间上,最
后清理掉Eden 和刚才用过的Su rvivor空间。
5、标记--整理算法
标记需要回收的对象,让所有存活的对象向一端移动,清除边界以外的内存
6、分代收集算法
把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记—清理”或者“标记—整理”算法来进行回收。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值