博客
关于我
JVM(二)垃圾回收器与内存分配策略
阅读量:661 次
发布时间:2019-03-15

本文共 1265 字,大约阅读时间需要 4 分钟。

垃圾回收机制

1. 垃圾回收策略

1.1 对象存活判断

垃圾回收需要判断对象是否仍然存活,即是否有可达路径(Reachability)。主要有两种常用方法:

1.1.1 引用计数法

  • Python 和 C++ 常用这种方法。
  • 给每个对象附加一个引用计数器,引用增加计数器,释放时减少。
  • 计数器为 0 的对象被标记为不在存活。
  • 缺点:无法解决循环引用问题。

1.1.2 可达性分析算法

  • Java 和 C# 使用。
  • 核心思想:从 GC Roots 开始,沿着可达路径标记对象。
  • 若路径断绝,则对象视为不存活。

1.2 GC Roots

  • 包括:
  • 虚拟机栈中的临时变量引用。
  • 本地方法栈中的 JNI 引用。
  • 方法区中的类静态变量引用。
  • 方法区中的常量引用。

2. 引用扩充

JDK 1.2以后引入了四种引用的强度:

  • 强引用:最常见的引用,覆盖许多日常对象。
  • 软引用:用来缓存非必需对象,比如[LRU缓存].
  • 弱引用:对象在内存不足时会被回收。
  • 虚引用:最弱的引用,无法阻止对象回收,但提供回收时的回调通知。
  • // 软引用示例SoftReference softRef = new SoftReference<>(new Object());softRef.clear();// 弱引用示例WeakReference weakRef = new WeakReference<>(new Object());weakRef.clear();

    3. 对象自我拯救

    在 GC 开始回收时,如果对象不再可达,系统可能立即回收。但有些对象会自行拯救:

    • calling finalize():这是对象实现自救的唯一机会。
    • finalize() 未被调用或未能完成自救,对象将被回收。
    public void finalize() throws Throwable {    // 在这里进行自救操作    System.out.println("正在自救...");    referenceQueue.add(this);}

    4. 方法区的回收

    特点:

    • 简单对象(如常量、静态变量)被回收。
    • 回收频率低,主要处理废弃的类和不用的常量。

    5. 堆的垃圾回收算法

    5.1 标记-清除算法

    • 样例:对新生代进行快速回收,但效率较低。
    • 缺点:内存碎片较多。

    5.2 复制算法

    • 适用于新生代:
      • 内存分为 Eden、From、To 三个区域。
      • 不断复制存活对象到 From-To 区域,清理旧区。
      • 长期存活的对象进入老年代。

    5.3 标记-整理算法

    • 专门处理老年代:
      • 整理阶段将存活对象集中到一边,然后清理边界外的空间。
      • 替代了传统的清除算法,减少了内存碎片。

    5.4 分代收集策略

    • 新生代使用复制算法,老年代使用标记-整理。
    • 最新 Java GC 集线性处理算法提高效率。

    Minor GC 与 Full GC

    • Minor GC:主要处理新生代。
    • Full GC:处理老年代,回收速度较慢。

    通过以上策略,垃圾回收系统能够高效管理内存,平衡性能与节省内存空间。

    转载地址:http://itlmz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现merge sort归并排序算法(附完整源码)
    查看>>
    Objective-C实现mergesort归并排序算法(附完整源码)
    查看>>
    Objective-C实现miller rabin米勒-拉宾素性检验算法(附完整源码)
    查看>>
    Objective-C实现Miller-Rabin素性测试程序(附完整源码)
    查看>>
    Objective-C实现Miller-Rabin素性测试程序(附完整源码)
    查看>>
    Objective-C实现MinhashLSH算法(附完整源码)
    查看>>
    Objective-C实现MinhashLSH算法(附完整源码)
    查看>>
    Objective-C实现MinHeap最小堆算法(附完整源码)
    查看>>
    Objective-C实现minimum cut最小切割流算法(附完整源码)
    查看>>
    Objective-C实现minimum partition最小分区算法(附完整源码)
    查看>>
    Objective-C实现MSRCR算法(附完整源码)
    查看>>
    Objective-C实现multilayer perceptron classifier多层感知器分类器算法(附完整源码)
    查看>>
    Objective-C实现multiplesThreeAndFive三或五倍数的算法 (附完整源码)
    查看>>
    Objective-C实现n body simulationn体模拟算法(附完整源码)
    查看>>
    Objective-C实现naive string search字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现natural sort自然排序算法(附完整源码)
    查看>>
    Objective-C实现nested brackets嵌套括号算法(附完整源码)
    查看>>
    Objective-C实现nevilles method多项式插值算法(附完整源码)
    查看>>
    Objective-C实现newtons second law of motion牛顿第二运动定律算法(附完整源码)
    查看>>
    Objective-C实现newton_raphson牛顿拉夫森算法(附完整源码)
    查看>>