美文网首页
JVM学习(一)判断对象是否可回收和回收算法

JVM学习(一)判断对象是否可回收和回收算法

作者: lunabird | 来源:发表于2018-08-03 09:01 被阅读5次

    一、对象已死吗?

    • 引用计数算法不能解决循环引用问题,所以java虚拟机不用这种算法判断对象是否能回收。
    • java,c#甚至古董Lisp都是通过可达性分析算法来判断对象是否存活的。


      image.png
    • 引用,java1.2之后,将引用分为强引用,软引用,弱引用,虚引用4种。
    • 即使在可达性分析算法中不可达的对象,也不是非死不可的。至少需要两次标记过程。finalize()方法是对象逃脱死亡命运的最后一次机会。
    • 回收方法区(HotSpot的永久代)。废弃常量和无用的类。

    二、垃圾收集算法

    1.标记-清除算法

    最基础,后续的算法都是基于这种思路。
    不足:(1)效率不高;(2)造成内存碎片;


    image.png

    2、复制算法

    可用内存容量分为大小相同的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另一块上面。


    image.png

    现代商业虚拟机都采用这种收集算法来回收新生代。
    一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。HotSpot默认的Eden和survivor比例是8:1.
    如果另外一块Survivor空间没有足够的空间存放上一次新生代手机下来的存活对象时,这些对象直接通过分配担保机制进入老年代。

    3、标记-整理算法

    适用于老年代。
    让所有存货对象都向一端移动,然后直接清理掉端边界以外的内存。


    image.png

    4、分代收集算法

    就是给内存分成了新生代和老年代,给新生代用的复制算法,给老年代用的标记-清除或者标记-整理算法。

    相关文章

      网友评论

          本文标题:JVM学习(一)判断对象是否可回收和回收算法

          本文链接:https://www.haomeiwen.com/subject/guasvftx.html