垃圾收集算法

1、在介绍垃圾收集算法之前,首先介绍一下其他的算法。

①引用计数算法:给对象添加一个引用计数器,每当有一个地方引用时,就加1,当引用失效时,就减1。任何时刻计数器为0的对象就是不可能再被使用的。

    但是java中并没有选择该算法来管理内存,主要原因是因为很难解决对象之间的相互循环引用。

②根搜索算法:通过名为“GC Roots”的对象做为起始点,从这些节点开始,向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明该对像是不可用的。从这里可以看出,如果一个对象不被任何对象引用,但是它包含的属性对象被引用的话,也一样会被回收。可以做为GC Roots的对象包括:

    a、虚拟机栈,即栈帧中本地变量表中的引用的对象

    b、方法区中的类静态属性引用的对象

    c、方法区中的常量引用的对象

    d、本地方法中的Native方法所引用的对象

2、判断对象是生存还是死亡?

   如果对象在进行根搜索后发现没有与GC Roots相关联的引用链,那么将会被第一次标记并进行一次筛选,筛选的条件是对象是否有必要执行finalize()方法。

   如果对象没有覆盖“finalize()”方法,或者finalized()方法已经被虚拟机调用过,则被视为”没有必要执行“。

   如果有必要执行该方法,那么该对象会被放置在一个称谓F-Queue的队列之中,并在稍后由虚拟机去执行。这里所说的执行,只是指虚拟机会触发这个方法,并不等于会等待它执行结束。原因是,有可能执行太慢,或者产生了死循环。将会很可能导致F-Queue队列中的其他对象永远等待,进而导致系统崩溃。finalize()只会执行一次,并且该方法是对像逃脱死亡的最后一次机会。

3、如何判断一个对象是无用的?

   a、该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。

   b、加载该类的classLoader已经被回收。

   c、该类对应的java.lang.Class对象没有在任何地方引用。无法在任何地方通过反射访问该类的方法

        在永久代中,一般收集废弃常量和无用类这两部分内容。

4、垃圾收集算法

   ①标记--清除算法:首先标记出所有需要回收的对象,标记完成之后统一回收掉所有被标记的对象。

       缺点:效率不高;碎片过多,容易触发另一次垃圾收集动作。

   ②标记--复制算法:将可用内存划分为大小相等的两块,每次只使用其中一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

      缺点:每次只使用其中一块,代价过高。

   ③标记--整理算法:首先标记出所有需要回收的对象,然后让所有存活的对象都向一端移动,最后直接清理掉边界以外的内存。

   ④分带收集算法:新生代中,每次垃圾收集时只有少量存活,所以使用标记--复制算法。 

                               老年代中,对象存活率高,没有额外的空间,必须使用“标记--清理”,或者“标记--整理”算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值