【jvm】如何判断一个对象是否可以回收

embedded/2024/11/17 19:55:40/

目录

        • 1.引用计数法
          • 1.1 原理
          • 1.2 缺点
        • 2.可达性分析算法
          • 2.1 原理
          • 2.2 GC Roots
          • 2.3 标记-清除阶段
        • 3.引用类型

1.引用计数法
1.1 原理
  • 1.为每个对象创建一个引用计数,当有对象引用该对象时,计数器加1。
  • 2.当引用失效时,计数器减1。
  • 3.当计数器的值为0时,表示该对象没有被任何对象引用,因此可以被回收。
1.2 缺点
  • 1.引用计数法存在循环引用的问题。
  • 2.如果两个对象相互引用,它们的引用计数将不会为0,导致无法回收,进而造成内存泄漏。
  • 3.JVM中的主流垃圾回收器通常不单独使用这种方法。
2.可达性分析算法
2.1 原理
  • 1.可达性分析算法是JVM判断对象是否可回收的核心算法。
  • 2.它从一组称为GC Roots的根对象开始,通过递归方式遍历引用图,判断哪些对象是可达的,哪些是不可达的。
  • 3.如果一个对象从GC Roots无法到达,则该对象被视为不可达,可以被垃圾回收。
2.2 GC Roots
  • 1.GC Roots是可达性分析算法的起点,包括以下几种对象:
  • 2.栈帧中的局部变量:当前正在执行的方法中的所有局部变量和参数。
  • 3.方法区中的静态变量:所有类的静态属性(类变量)和常量引用的对象。
  • 4.本地方法栈中的JNI(Java Native Interface)引用:通过JNI调用的本地代码中持有的对象引用。
  • 5.活动线程:正在运行的线程本身也被视为GC Roots。
2.3 标记-清除阶段
  • 1.可达性分析算法通常分为标记清除两个阶段:
  • 2.标记阶段:从GC Roots开始遍历所有可达的对象,并进行标记。JVM会使用一个标志位来标记对象是否可达。
  • 3.清除阶段:在标记完成后,JVM遍历堆中的所有对象,将未被标记的对象视为垃圾,清除这些对象所占用的内存。
3.引用类型
  • 1.在进行可达性分析时,JVM还考虑了不同的引用类型,这些引用类型决定了对象的可达性及其回收时机。
  • 2.强引用:强引用是Java中的默认引用类型。只要一个对象有强引用存在,垃圾回收器就不会回收它。
  • 3.软引用:使用SoftReference类表示。只有在内存不足时,JVM才会回收被软引用持有的对象。软引用通常用于实现内存敏感的缓存。
  • 4.弱引用:使用WeakReference类表示。只要垃圾回收器发现一个对象只被弱引用持有,就会回收该对象。弱引用主要用于实现规范化映射,如WeakHashMap。
  • 5.虚引用:使用PhantomReference类表示。虚引用是最弱的一种引用,无法通过虚引用访问对象。虚引用的存在主要用于跟踪对象被垃圾回收的状态,可以在对象被回收后执行一些清理操作。

http://www.ppmy.cn/embedded/138326.html

相关文章

mindtorch study

安装 pip install mindtorch mindtorch 用于帮助迁移torch模型到mindspore 大部分都可以直接把mindtorch的torch搞成torch,就和以前的代码一致,注意下面 只有静态图有点点差异 step也有差异 自定义优化器就麻烦了。 pyttorch还是牛啊 并行计算还是用的…

06.VSCODE:备战大项目,CMake专项配置

娇小灵活的简捷配置不过是年轻人谈情说爱的玩具,帝国大厦的构建,终归要交给CMake去母仪天下。一个没有使用 CMake 的 C 项目,就像未来世界里的一台相声表演,有了德纲却无谦,观众笑着遗憾。—— 语出《双城记》作者&…

时间序列数据结构、持久数据结构详细解读

一、时间序列数据结构 (Time Series Data Structures) 时间序列数据结构 专门设计用于存储、查询和分析 时间序列数据,即一组按时间顺序排列的数据点。这些数据结构在金融分析、物联网监控、传感器数据收集等场景中应用广泛。常见的时间序列数据结构包括 时间序列数…

RabbitMQ 在 Java 和 Spring Boot 中的应用详解

1. 引言 RabbitMQ 是一种开源消息代理软件,广泛用于实现消息传递、队列管理和负载均衡。它通过实现 AMQP(Advanced Message Queuing Protocol)来支持复杂的消息传递模式,是常见的消息中间件之一。本文将深入探讨如何在纯 Java 环…

IDEA leetcode插件代码模板配置,登录闪退解决

前言 最近换电脑,配置idea时和原来的模板格式不一样有点难受,记录一下自己用的模板,后期换电脑使用,大家也可以使用,有更好的地方可以分享给我~ IDEA leetcode插件代码模板配置,登录闪退解决 前言1 下载IDEA leetcode…

【nginx】client timed out和send_timeout的大小设置

websocket连接会断开,抓包检查后发现是中间的代理服务器nginx断开的,同时将后端和浏览器都断开了。将nginx日志调到debug级别后,有下面的断开信息。 [info] 125923#125923: *34 client timed out (110: Connection timed out) while proxyin…

使用Kafka实现大规模数据流处理的最佳实践

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用Kafka实现大规模数据流处理的最佳实践 使用Kafka实现大规模数据流处理的最佳实践 使用Kafka实现大规模数据流处理的最佳实践…

网络物理隔离应用

目录 网络物理隔离应用-内网工作站安全隔离网络物理隔离应用-电子政务网闸应用政务外网 vs 政务内网 vs 政法专网公安几张网:公安信息网、视频专网、互联网公安视频专网技术架构 网络物理隔离应用-内网工作站安全隔离 工作机安全上网实例:在需要上因特网…