jvm垃圾回收机制

2018-03-11  本文已影响0人  鹤书嗣音

1.判断对象是否已死:

  1.引用技术法:给对象添加引用计数器纪录被引用次数

    实现简单判定高效、但是无法解决对象循环引用的问题,实际上较少使用

  2.可达性分析算法:从gc root对象作为起点向下搜索引用链,与引用链不能相连的对象即被判定为可回收对象。gcroot:本地变量表中引用对象、类静态属性引用对象、方法常量引用对象、native方法引用对象

      主流商用语言使用

2.引用

    1.强引用:赋值引用,只要存在就不会被回收

      2.软引用:有用但非必需,在内存溢出前才被第二次回收,若回收后内存仍不够才会抛出内存溢出异常

      3.弱引用:被引用对象只能存活到下次垃圾回收之前,垃圾收集器工作时无论内存是否足够都会回收

      4.虚引用:对对象生存时间不会构成影响,仅起到被回收前进行系统通知的作用

3.对象被回收过程:

    1.第一次标记:可达性分析认为可回收

      2.第二次标记:对象的finalize()方法被调用期间仍未与引用队列上对象建立引用关系

    3.被真正回收

4.垃圾回收算法

    1.标记清除算法:标记出需要回收对象,然后统一进行回收

        标记、清除效率都不高;清除完成后产生大量内存碎片,不好对较大对象进行内存分配

      2.复制算法:将内存一分为二,一块用于存储,空间用完后将还存活的对象一次性复杂到另一半,并清除掉前一半所有数据

        运行效率高,不用考虑碎片问题。现多用于新生代(回收率高),分为一块大内存与两块小内存,在大的和其中一块小的上面进行存储,回收时将存活对象复制到另一块小内存上。

      3.标记整理算法:标记后将所有存活对象移动到一起,然后清除存活对象范围外内存

        针对对象存活率较高的老年代,避免了较多的复制次数及额外空间分配

上一篇下一篇

猜你喜欢

热点阅读