博客
关于我
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/

    你可能感兴趣的文章
    None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
    查看>>
    NoNodeAvailableException None of the configured nodes are available异常
    查看>>
    Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件
    查看>>
    nopcommerce商城系统--文档整理
    查看>>
    NOPI读取Excel
    查看>>
    NoSQL&MongoDB
    查看>>
    NoSQL介绍
    查看>>
    NoSQL数据库概述
    查看>>
    Notadd —— 基于 nest.js 的微服务开发框架
    查看>>
    NOTE:rfc5766-turn-server
    查看>>
    Notepad ++ 安装与配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    Notepad++在线和离线安装JSON格式化插件
    查看>>
    notepad++最详情汇总
    查看>>
    notepad++正则表达式替换字符串详解
    查看>>
    notepad如何自动对齐_notepad++怎么自动排版
    查看>>
    Notes on Paul Irish's "Things I learned from the jQuery source" casts
    查看>>
    Notification 使用详解(很全
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    NotImplementedError: Could not run torchvision::nms
    查看>>
    nova基于ubs机制扩展scheduler-filter
    查看>>