当前位置: 首页 > news >正文

9. JVM垃圾回收

1. 对象垃圾回收

如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。

如果要定位什么是垃圾,有两种方式来确定:

  • 第一个是引用计数法
  • 第二个是可达性分析算法。

1.1 引用计数法

  • 每个对象维护一个引用计数器

  • 当有引用指向该对象时,计数器加1

  • 当引用失效时,计数器减1

  • 当计数器为0时,表示对象可以被回收

示例:

Object A = new Object();  // A的引用计数=1
Object B = A;            // A的引用计数=2
A = null;                // A的引用计数=1 (B仍引用)
B = null;                // A的引用计数=0 (可回收)

优点:

  • 实现简单

  • 可以立即回收垃圾对象

  • 回收操作平摊在程序运行过程中

缺点

  • 无法解决循环引用问题(主要缺点)

  • 计数器维护带来额外开销

  • 多线程环境下需要同步操作计数器

// 循环依赖的情况
class Node {Node next;
}Node a = new Node();  // a计数=1
Node b = new Node();  // b计数=1
a.next = b;          // b计数=2
b.next = a;          // a计数=2a = null;            // a计数=1 (b.next引用)
b = null;            // b计数=1 (a.next引用)
// 此时a和b形成循环引用,计数都不为0,但实际已不可达

1.2 可达性分析算法

  • JVM采用的垃圾回收算法

  • 通过一系列称为"GC Roots"的根对象作为起始点

  • 从这些根对象开始向下搜索,搜索走过的路径称为"引用链"

  • 当一个对象到GC Roots没有任何引用链相连时,则判断为可回收对象

GC Roots包括 :

  1. 虚拟机栈(栈帧中的局部变量表)中引用的对象

    void method() {Object obj = new Object();  // obj是GC Root
    } // 方法结束后obj不再为GC Root
  2. 方法区中类静态属性引用的对象

    class MyClass {static Object staticObj;  // staticObj是GC Root
    }
  3. 方法区中常量引用的对象

    class MyClass {final static Object CONST_OBJ = new Object();  // GC Root
    }
  4. 本地方法栈中JNI(即Native方法)引用的对象

  5. Java虚拟机内部的引用(如基本类型对应的Class对象)

  6. 被同步锁(synchronized)持有的对象

优点

  • 可以解决循环引用问题

  • 更适合面向对象的语言特性

缺点

  • 需要暂停用户线程(Stop The World)进行可达性分析

  • 实现相对复杂

对比总结

特性引用计数法可达性分析算法
实现复杂度简单复杂
循环引用处理无法处理可以处理
实时性实时回收需要GC触发
性能开销计数操作分散集中式GC停顿
使用场景Python、PHP等Java、C#等

2. 问题总结 

2.1 对象什么时候可以被垃圾器回收?

如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾如果定位了垃圾,则有可能会被垃圾回收器回收。

2.2 定位垃圾的方式?

  • 引用计数法
  • 可达性分析算法

上一篇   下一篇

http://www.dtcms.com/a/275371.html

相关文章:

  • 持有对象-基本概念
  • 多 Agent 强化学习实践指南(一):CTDE PPO 在合作捕食者-猎物游戏中的应用详解
  • 检查输入有效性(指针是否为NULL)和检查字符串长度是否为0
  • 图像扭曲增强处理流程
  • 基于 AI 的大前端网络请求优化:动态调整与缓存策略
  • Nginx模块注册全流程揭秘:为什么Nginx模块化架构依然是Web服务器的“金标准”?
  • stack和queue的使用和模拟实现以及了解deque
  • 以数据为核心,以业务为导向,漫谈数据可视化应用
  • 网络编程员工管理系统
  • 【MogDB】一种基于ctid分片并发查询以提升大表查询性能的方式
  • RBAC权限模型深度解析:从理论到企业级实践
  • 贪心算法题解——跳跃游戏 II【LeetCode】
  • The Black Heart
  • 飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构新生态
  • 【极客日常】后端任务动态注入执行策略的一种技术实现
  • 27.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(一)
  • .net机器学习框架:ML.NET数据处理
  • 【嵌入式硬件实例】-555定时器实现倍压电路
  • 钉钉小程序开发环境配置与前端开发指南
  • 计算机毕业设计ssm基于SSM的萌宠交流平台 基于SSM的毛孩子互动分享与领养系统 SSM架构下的宠物社交·商城·救助一体化平台
  • Mac M芯片安装RocketMQ服务
  • 【Docker基础】Dockerfile指令速览:基础常用指令详解
  • 【STM32实践篇】:最小系统组成
  • 实战指南:用pmap+gdb排查Linux进程内存问题
  • 9.4 自定义SMC服务开发
  • springboot使用@Validated不起作用
  • 加法器学习
  • AI图像修复工具CodeFormer实测:马赛克去除与画质增强效果评测
  • Java使用Langchai4j接入AI大模型的简单使用(四)--整合Springboot
  • Window/linux获得程序运行目录C++