美文网首页
JVM垃圾收集(理论)

JVM垃圾收集(理论)

作者: 快点给我想个名 | 来源:发表于2019-10-17 22:39 被阅读0次
    垃圾判断算法
    • 引用计数算法
          给对象添加一个引用计数器,每当有一个地方引用它,计数器值就加1.当引用失效后,计数器值就减1.任何时刻计数器为0的对象就是不可能再被使用的。但是无法解决对象之间互相循环引用的问题。
    • 可达性分析算法
          通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明次对象是不可用的。
      • GC Roots的对象包括
        1.虚拟机栈(栈帧中的本地变量表)中引用的对象
        2.方法区中类静态属性引用的对象
        3.方法区中常量引用的对象
        4.本地方法栈中JNI引用的对象
    堆和方法区垃圾回收
    • 堆垃圾回收
          在堆中,尤其是在新生代,常规应用进行一次GC一般可以回收70%-95%的空间,而方法区的GC效率远低于此。
    • 方法区垃圾回收
          方法区主要回收两部分内容:废弃常量和无用的类。类回收需要满足下面3个条件:
      1.该类所有的实例都已被回收,也就是Java堆中不存在该类的任何实例
      2.加载该类的ClassLoader已经被回收
      3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法
    垃圾收集算法
    • 标记-清除算法(Mark-Sweep)
          算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,然后回收所有需要回收的对象。
      • 缺点
        1.效率问题:标记和清除两个过程效率都不高,需要扫描所有对象。堆越大,GC越慢。
        2.空间问题:标记清理之后会产生大量不连续的内存碎片,内存碎片太多导致后续使用时无法找到足够连续的内存空间。从而导致提交触发一次垃圾回收。
    • 标记-整理算法(Mark-Compact)
          标记整理和标记清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。比标记清除算法耗费更多的时间进行整理。
    • 复制算法(Copying)
          将可用内存空间划分为两块,每次只使用其中一块,当半区内存用完了,将仅还存活的对象复制到另一块上面。然后就把原来内存空间清空即可。
      • 缺点
        1.需要将内存缩小为原来的一半
    • 分代收集算法

    相关文章

      网友评论

          本文标题:JVM垃圾收集(理论)

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