news 2026/7/22 0:25:00

如何判断一个对象是否可以被回收?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何判断一个对象是否可以被回收?

文章目录

  • 对象存活判断
  • 引用计数算法
  • 可达性分析算法
    • 概述
    • 基本思路
    • GC Roots

对象存活判断

  • 在堆里存放着几乎所以的Java对象实例,在GC执行垃圾回收之间;
  • 首先需要区分出内存中哪些是存活对象,哪些是已经死亡对象
  • 只有被标记为已经死亡对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程被我们称为垃圾标记阶段;
  • 那么在JVM中究竟怎么标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡;
  • 判断对象存活一般有两种方式:引用计数算法和可达性分析算法

引用计数算法

  • 其对每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况;
  • 对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就+1;
  • 当引用失效的时候,引用计数器-1;
  • 只要对象A的引用计数器的值为0,即表示对象A不可能被再使用,可进行回收。

优点:实现简单,垃圾对象便于辨识:判定效率高,回收没有延退性。

缺点:

  1. 它需要单独的字段存储计数器,这样的做法增加了存储空间的开销;
  2. 每次赋值都需要更新计数器,伴随着加法和减法操作,这增加了时间开销;
  3. 引用计数器有一个严重的问题,即无法处理循环引用的情况。这是一条致命的缺陷,导致在Java的垃圾回收器中没有使用这类算法。

可达性分析算法

概述

  • 相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点;
  • 更重要的是该算法可以有效地解决在引用计算算法中循环引用的问题,防止内存泄漏的发生
  • 这里的可达性分析是Java,c#选择的,这种类型的垃圾收集通常也叫做追踪性垃圾收集。

基本思路

  1. 可达性分析算法是根对象集合(GCRoots就是一组必须活跃的引用)为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达;
  2. 使用可达性分析算法后,内存中的存活对象都会被根对象集合直接或间接连接着,搜索所走过的路径称为引用链;
  3. 如果目标对象没有任何引用链相连,则是不可达的,就意味着该对象已经死亡,可以标记为垃圾对象;
  4. 在可达性分析算法中,只有能够被根对象集合直接或者间接连接的对象才是存活对象。

GC Roots

  • 虚拟机栈中引用的对象,比如:各个线程被调用方法中使用到的参数,局部变量等;
  • 本地方法栈内JNI(通常说的本地方法)引用的对象;
  • 方法区中类静态属性引用对象,不如Java类的引用类型静态变量;
  • 方法区中常量引用的对象,比如:字符串常量池(StringTable)里的引用;
  • 所以被同步锁synchronized持有的对象;
  • Java虚拟机内部的引用,基本数据类型对应的class对象,一些常驻的异常对象,系统类加载器;
  • 反映Java虚拟机内部情况JMXBean,JVMTI注册的回调,本地代码缓存等;
  • 除了这些固定GCRoots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象临时性地加入,同时构建成完整GC Roots集合
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 16:26:05

Open-AutoGLM在Win11上的部署秘籍(仅限高级开发者知晓)

第一章:Open-AutoGLM部署前的高级准备 在将 Open-AutoGLM 投入生产环境之前,必须完成一系列高级准备工作,以确保系统稳定性、安全性与可扩展性。这些步骤涵盖硬件资源配置、依赖项管理、环境隔离以及安全策略设定。 硬件与系统要求评估 Open…

作者头像 李华
网站建设 2026/7/21 18:27:48

别再让 AI 自由发挥了!用 LangChain + Zod 强制它输出合法 JSON

用 LangChain Zod 构建类型安全的 AI 结构化输出 —— 从“一句话解释 Promise”开始大模型很聪明,但也很“自由”。 你让它解释 Promise,它可能回你一段优美的散文; 你想要一个干净的 JSON,它却在前后加上“好的!”“…

作者头像 李华
网站建设 2026/7/21 20:07:48

24、云存储队列与表服务操作全解析

云存储队列与表服务操作全解析 在云存储的应用场景中,队列和表服务是非常重要的组成部分。下面将详细介绍队列消息的操作以及 Windows Azure 表服务的相关内容。 队列消息操作 消息入队 向队列中添加消息时,通过发送如下的 HTTP POST 请求: POST /testq1/messages?ti…

作者头像 李华
网站建设 2026/7/13 15:18:55

31、逐跳行为(PHB)及其实现示例

逐跳行为(PHB)及其实现示例 在网络通信中,为了实现不同类型流量的差异化服务,逐跳行为(Per-Hop Behavior,PHB)的概念应运而生。PHB 描述了差分服务(Diffserv)节点对特定差分服务行为聚合体的外部可观察转发行为。下面将详细介绍 PHB 的相关内容。 1. PHB 基础概念与…

作者头像 李华
网站建设 2026/7/21 18:09:51

互联网大厂求职:Java面试中的技术点和业务场景解析

互联网大厂求职:Java面试中的技术点和业务场景解析 场景描述: 在某互联网大厂的面试室内,面试官正襟危坐,而一旁坐着的程序员谢飞机则显得有些紧张。这是谢飞机的第N次面试,前几次的“辉煌战绩”让他今天不敢掉以轻心。…

作者头像 李华
网站建设 2026/7/21 23:24:09

智谱Open-AutoGLM究竟有多强?:3大核心技术解密国产AutoML新范式

第一章:智谱 Open-AutoGLM沉思在大模型与自动化机器学习交汇的前沿,智谱推出的 Open-AutoGLM 引发了广泛的技术关注。它并非传统意义上的 AutoML 工具,而是尝试将自然语言理解能力与自动化建模流程深度融合,实现以“对话”驱动机器…

作者头像 李华