垃圾收集算法

        堆中存放着几乎java世界中所有的对象实例,垃圾收集器在对堆进行回收之前,第一件事就是要确定这些对象有哪些还“存活”着,哪些已经“死去”。
        引用计数算法:引用计数法是最基本的方法:给对象中添加一个引用计数器,每一个地方引用它时,计数器就加1;当引用失效时,计数器的值就减1;任何>时刻计数器为0的对象就是不可能再被使用的。但是!它很难解决对象之间的相互引用问题。所以虚拟机并不是通过引用计数算法来判断对象是否存活的。
        根搜索算法:主流商用语言采用的判断对象是否存活的算法。这个算法的主要思想就是:通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始>向下搜索,搜索所走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达)时,则证明此对象不可>用,所以被判定为可回收对象。
        在java语言中,可以作为GC Roots的对象包括下面几种:
        虚拟机栈找你刚的引用的对象
        方法区中的类静态属性引用的对象
        方法区中的常量引用的对象
        本地方法栈中JNI的引用的对象
引用分为:强引用---指程序中普遍存在的类似“Object obj=new Object()”这类的引用。软引用用来描述一些还有用但是并非必须的对象。弱引用也用来描述非必须>但是强度比软引用还弱一些。虚引用是最弱的一种引用。

        根搜索算法中的不可达对象并不是“非死不可”de ,这时候他们暂时处于“缓刑”阶段。宣告死亡至少要经历两次标记过程:如果对象在进行根搜索后发现并没
有与GC Roots引用链相连接。那么将会被标记一次并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过。虚拟机将这两种情况都视为“没有必要执行”。如果有必要执行那么这个对象将被放置到名为F-Queue的队列中,稍后由一条虚拟>机自动创建的低优先级的Finalizer线程去执行。所谓的执行就是除法finalize()方法。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后GC将对F-Queue中>的对象进行第二次小规模的标记,如果第二次被标记时它将被移除“即将回收”的集合;那么就over了
        回收方法区:方法区(永久代)的垃圾收集的效率是比较低的。永久代的垃圾收集主要回收分为两部分内容:废弃常量和无用的类。回收常量--如果一个常>量已经进入到常量池中,但是当前系统中没有一个此常量名的对象,也没有其他地方引用了这个字面量,如果发生内存回收,而却有必要的话,这个常量将被“请出”>常量池。
        判断一个类是否是“无用”类:该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。加载该类的ClassLoader已经被回收。该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

垃圾收集算法:
        标记-清除算法:
                最基础的算法。分为“标记”和“清除”两个阶段。它有两个缺点:一个是效率问题,标记和清除过程的效率都不高;另一个就是空间问题,标记清除>后会产生大量不连续的内存碎片,空间碎片太多会导致,当以后的程序在运行过程中需要分配较大的对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收>集动作。标记-清除算法的执行过程:

        复制算法:
                它将可用内存按容量划分为大小相等的两块,每次只是用其中一块。当这块用完了就复制到另一块中。然后把使用过的内存空间一次清理掉。这样>就每次都对其中一块进行内存回收。简单高效但是内存缩小为原来的一般。如下图所示:

        标记-整理算法:
                标记的过程和标记-清除算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有存货的对象都想一端移动,然后直接清理掉端边界以
外的内存。如下图所示:

        分代收集算法:
                根据对象的存货周期的不同将内存分为几块。一般是将java堆分为新生代和老年代。新生代中,每次垃圾收集都有大量的对象死去,只有少量存活>,那就使用复制算法,只需要付出少量的复制成本就可以完成收集。而老年代中存活率较高,没有额外的空间对它进行担保,就必须采用“标记-清除”或“标记-清理”>算法进行回收。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值