美文网首页
读书笔记-Java中垃圾收集器与内分分配策略

读书笔记-Java中垃圾收集器与内分分配策略

作者: 一只胖Wa牛 | 来源:发表于2018-03-20 16:13 被阅读0次

    Java中可达性分析算法

    • Java语言中,可以作为GC Roots的对象有以下几种:
    • 虚拟机栈中引用的对象
    • 方法区中类静态属性引用的对象
    • 方法区中常量引用的对象
    • 本地方法栈中JNI引用的对象

    Java中的四种引用类型

    • 强引用(Strong Reference),只要引用还在,垃圾回收器就不会回收该对象
    • 软引用(Soft Reference),系统马上将要OOM了,就会优先回收掉该弱引用的对象
    • 弱引用(Weak Reference),来GC操作了,马上回收掉该引用的对象
    • 虚引用(Phantom Reference),也叫幽灵引用。完全不会对对象的生存时间产生影响(为一个对象设置虚引用关联的唯一目的就是能在这个对象被回收到一个系统通知)

    对象的回收

    • Java可达性分析算法中,即使被标记为“不可达”的对象,也不会立即回收,至少需要经历两次标记过程;如果对象在进行分析后,发现没有引用链,那么会被标记执行一个筛选的操作,筛选的条件是该兑现是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,那么虚拟机将这两种情况都是为“没有必要执行”
    • 如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个叫做F-Queue的对队列中,并在稍后由一个由虚拟机自动创建的、低优先级的Finalizer线程去执行。

    回收方法区

    • 方法区中进行垃圾手机的性价比一般比较低;在堆中,尤其是在新生代中,常规应用的一次垃圾收集一般可以回收70%~90%的空间,而永久带的垃圾收集效率远低于此
    • 方法区的垃圾回收一般包含两种:废弃常量无用的类
    • 废弃常量只要没用引用就可以回收,但是无用的类判定条件非常的苛刻,需要满足以下三个条件
      1.该类所有实例已经被回收
      2.加载该类的ClassLoader已经被回收
      3.该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法

    垃圾回收算法

    标记-清除法

    • 标记-清除(Mark-Sweep)算法,作为最基本的算法,主要包含标记清除*两个阶段:
    • 标记阶段中,统一标记所有要回收的对象,清除阶段根据之前的标记进行回收。大概的过程如下:



    • 这种算法主要有两点不足
      1.效率性:标记和清除这两个过程的效率都不高
      2.空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作

    复制算法

    • 复制算法将内存按照容量划分为大小相等的两块,每次只使用其中一块。一块内容使用完了,就将还存活着的对象复制到另外一块上面,然后再把已经使用过的内存空间一次清理掉。这样做每次都是针对整个半区进行清理回收,内存分配时也就不用考虑内存碎片等复杂的情况,只要一动堆顶指针,按顺序分配内存即可,实现简单,运行高效。示意图如下:


    • 这种算法的缺点是,可用内存缩小为原来的一半,代价比较高
    • 分代方式也是采用的这种算法来回收新生代的内存

    标记-整理算法

    • 复制收集算法在对象存活率较高时,就要进行多次的复制操作,效率就会变低。更关键的是,如果不想浪费50%的空间,就需要额外的空间进行分配担保,以应对被使用的内存中所有对象都被100%存活的极端情况,所以在老年代一般不能直接采用这种算法
    • 标记-整理(Mark-Compact)算法的过程与标记-清除算法过程一致,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存,示意图如下:

    分代收集算法

    • 这种算法将内存划分为几块区域进行分别管理。Java将堆分为新生代和老年代,这样就可以根据各个年代的特点采用最释放的手机算法。在新生代中,每次垃圾收集都伴随着大批对象的清除,只有少量存货,那么就算用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率较高,没有额外空间可以进行分配担保,就必须采用标记-清除或者标记-整理算法来进行回收

    垃圾收集器种类

    相关文章

      网友评论

          本文标题:读书笔记-Java中垃圾收集器与内分分配策略

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