JVM学习笔记2-对象的引用和生命周期

Java进阶之JVM对象生命周期 前言 上周有反映内容对于初学者较难,其实我觉得是讲的内容太多,导致自己不能生动具象地让所有人理解透彻,之后会注意。这里更提出两点建议适用于学习知识: 1. 不要囫囵吞枣,理论性知识要逐字地去看 2. 选取适当且固定的知识源,官网经典书籍优先,养成学习惯性 我写博客的目的就是更好地让大家理解难懂的概念,然后可以再去深入地讨论问题 本期介绍JVM对象生命周期,应该算是一个常见且基础的问题,这里再拿出来重新梳理,希望能对读者有所帮助。 一,Java 对象的本质 什么是Java对象 Java 阅读详情

1.哪些区域需要垃圾回收

栈是线程级别的在线程结束时就释放了。

接下来关注进程级别的:

方法区:主要保存类信息,常量,静态变量等,占用的空间相对稳定。

垃圾回收主要是堆

2.垃圾回收策略要考虑哪些方面

策略未必能完全落地。

a.回收的多-速度慢

b.回收的快-回收的少

c.回收哪些内容

直接想法:对象的引用计数为0。遇到的问题:不好解决循环引用的问题。

实际:垃圾收集器会回收GC Root不可达的对象

3.对象的生命周期

4.对象的引用

不同类型的引用,在垃圾收集方面的行为不同。

强引用

强引用是Java中最常见的引用类型。当一个对象被强引用变量引用时,无论任何情况,垃圾收集器都不会回收这个对象。即使在内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误,使程序异常终止,也不会回收这种对象。在Java中,我们平常最常见的就是强引用,例如:

String str = new String("Hello");

在这个例子中,`str`就是一个强引用。只有当`str`不再引用"Hello"(例如,`str = null`)时,"Hello"对象才可能被垃圾收集器回收。

软引用 SoftReference

只有当JVM内存不足时,垃圾收集器才会清除该对象。这使得它们对于缓存非常有用,因为只要内存充足,它们就会保留其值,并在其他地方需要内存时释放它们。

SoftReference<String> softReference = new SoftReference<>("Hello");

当持有时间过长没有使用的时候,也会回收。一些图片缓存会使用软引用。

使用场景:多用于处理占用内存大的,生命周期长的,使用不太频繁的对象。

优势:避免重复创建,提升内存使用效率的优化技术。

弊端:没被回收时,占用内存大,影响程序运行效率。

弱引用 WeakReference

使对象更易被回收。

只要垃圾收集器确定对象是弱可达的(也就是说,只能通过遍历弱引用来达到),就会清除该对象。这使得它们对于应该在其键不再在其他地方使用时自动删除其条目的映射非常有用。

使用场景:用于不容易被回收的情况。实际使用场景狭窄,较少用到。

虚引用 PhantomReference

PhantomReference是一种引用类型,只有在调用了finalize方法并且对象不再使用后,垃圾收集器才会清除该对象。这使得它们对于以比Java终结机制更灵活的方式安排死前清理操作非常有用。

使用场景:较少,主要辅助finalize的使用。

finalize方法

可不看。从Java 9开始,finalize方法已经被标记为deprecated,也就是不推荐使用。

是Java中Object类的一个方法,它会在垃圾收集器决定回收对象之前被调用。这个方法主要用于执行清理操作,比如释放非内存资源。  

当垃圾收集器准备回收一个对象时,如果发现这个对象的类覆盖了finalize方法,那么垃圾收集器会将这个对象添加到一个名为finalization queue的队列中,并在某个时刻调用这个对象的finalize方法。  

需要注意的是,finalize方法并不是一个可靠的资源清理手段。因为垃圾收集器的运行时机是不确定的,所以finalize方法的调用时机也是不确定的。此外,如果在finalize方法中出现异常,异常不会被捕获,也不会影响垃圾收集器的运行,这可能会导致资源无法被正确清理。  因此,从Java 9开始,finalize方法已经被标记为deprecated,也就是不推荐使用。对于需要清理的资源,推荐使用try-with-resources语句或者显式的close方法进行清理。 

ReferenceQueue

提供的对要回收对象操作的可能性。

用于接收已经被垃圾收集器确定为可回收的对象的引用。当垃圾收集器决定回收一个对象,且该对象关联了一个ReferenceQueue,那么这个对象的引用就会被加入到这个ReferenceQueue中

ReferenceQueue常与SoftReference,WeakReference和PhantomReference一起使用。当创建这些引用类型时,可以选择传入一个ReferenceQueue。

当垃圾收集器决定回收这些引用所指向的对象时,这些引用就会被加入到它们关联的ReferenceQueue中。  

这样,我们就可以通过检查ReferenceQueue来知道哪些对象已经被垃圾收集器决定回收,来做一些相应的处理。这对于清理一些资源,如关闭文件句柄,网络连接等非常有用。

5分钟搞定!用Keil MDK将STM32F103C8T6工程无缝迁移到ZET6开发板 本文详细介绍了如何在Keil MDK环境下快速将STM32F103C8T6工程迁移到ZET6开发板,涵盖硬件差异对比、工程配置调整、外设适配及编译排错等关键步骤,帮助开发者5分钟内完成工程移植,大幅提升开发效率。 阅读详情

相关推荐

【原理】OpenClaw Agent loop回顾一文清

OpenClaw智能体运行流程涉及从消息接收、上下文组装、模型推理到工具执行、流式回复及持久化的完整闭环。其核心机制包括会话队列管理(支持steer/followup等模式)、并发控制、提示词动态组装及工具调用循环。系统通过文件锁、事件桥接压缩策略保障可靠性,同时提供灵活的队列配置与生命周期管理,实现高效、安全的智能体交互。流程严格遵循验证→推理→执行→回复的线性步骤,并支持多轮工具调用迭代,最终将完整对话记录持久化存储。

海兰 19

Java对象在什么时候被销毁

对象销毁是由Java的垃圾回收机制(Garbage Collector)

哎 你看的博客 1555

十分钟学会排查线上JVM溢出

设置最大最小内存均为200mb为了快速OOM。

七叔的博客 25

从零开始理解JVM对象生命周期对象销毁(垃圾回收)

在学垃圾回收器之前,我们先要知道,jvm参数是怎么回事。因为配置各种回收器,必须对应各种参数设置。标准参数(-)所有的JVM实现都必须实现这些参数的功能,而且向后兼容非标准参数(-X)默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容非Stable参数(-XX)各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变。jvm-X参数是非标准参数,也就意味着,在不同版本的jvm中,参数可能会有所不同。

qq_46248151的博客 1585

JVM对象的内存模型、创建过程、对象引用生命周期

了解学习JVM虚拟机中,对象的内存模型是怎样设计的、对象的创建过程是怎样的、对象引用关系、对象的命周期以及对象的回收等。

积跬步,至千里。 1271

JVM对象生命周期

 JVM对象生命周期JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)。上面的这7个阶段,构成了JVM对象的完整的生命周期。下面分别介绍对象在处于这7个阶段时的不同情

dongliheng的专栏 1210

JVM内存模型--对象生命周期

什么时候才会进行垃圾回收?关注内存的回收,是选择收的多还是选择垃圾回收线程耗时短回收时间短到何种程度,1次网络延迟时间是多久CPU使用率很高的情况下,适当降低垃圾回收的频率,有一系列的问题。

weixin_43860222的博客 714

JVM对象生命周期对象引用以及垃圾收集算法)

JVM(总结一对象生命周期对象引用以及垃圾收集算法) 三.对象生命周期 四.对象引用 五.垃圾收集算法 垃圾收集需要完成的三件事情: 什么内存需要收集(判定无用的对象) 什么时候回收(何时启动,不影响程序正常运行) 如何回收(回收过程,要求速度快/时间短/影响小) 三.对象生命周期 对象通过构造函数创建, 但是没有析构函数回收内存‘ 对象存活在离它 最近的一对大括号中 垃圾收集 Java程序语言关于内存回收的API Object的finalize方法,垃圾收集器在回收对象时调用,有且仅被调

qq_42009262的博客 360

JVM——java对象生命周期(引用类型 创建对象规则)(网摘)

JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)。上面的这7个阶段,构成了 JVM对象的完整的生命周期。下面分别介绍对象在处于这7个阶段时的不同情形。 创建阶段在对象创建阶段,系统要通过下面的步骤,完成对象的创建过程:(1)为对象分配存储空间。(2)开始构造对象。(3)递归调用其超类

chiperfect的专栏 2035

引用、软引用、弱引用的区别解析

本文章转载自https://www.cnblogs.com/skywang12345/p/3154474.html 1 Java引用介绍 Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为: 强引用 > 软引用 > 弱引用 > 虚引用 ⑴强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具...

apricotCandy的博客 1万+

JVM对象生命周期详解

                                                          JVM对象生命周期详解  在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finaliz

LonelyTree的专栏 629

对象生命周期

JVM运行空间中,对象的整个生命周期大致可以分为7个阶段: 创建阶段(Creation)、应用阶段(Using)、不可视阶(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)。上面的这7个阶段,构成了 JVM对象的完整的生命周期。 创建阶段: 在对象创建阶段,系统要通过下面的步骤,完成对象的创建过程: (1)为对象分配存储空间。 (2)开始构造对象。 (3)递归调用其超类的构造方法。

clebron的博客 2242

RocketMQ 同一 JVM 启动多个 Producer 导致 NameServer 只连一个的问题

这个问题本质上不是 NameServer 配置没生效,而是:同一 JVM 下,多个 Producer 因为 ClientId 相同,底层共用了同一个。短期解法如果确实要一个 JVM 连多个 MQ 集群,就为不同 Producer/Consumer 设置不同的。长期解法如果只是集群迁移,直接统一所有到新地址,避免维护多套客户端资源。排查这类问题时,别只看业务代码里的,还要看到底层客户端实例是否被复用了。

阿昌爱Java 318

Linux-JVM线程查询

【代码】Linux-JVM线程查询。

u013578042的博客 49

LangGraph 会话切换与短期记忆管理

本文介绍了使用LangGraph构建Agent应用时的会话记忆管理方案。核心是通过Checkpointer机制实现多轮对话跟踪会话隔离,重点演示了基于InMemorySaver的内存存储实现方式。文章包含以下要点: 基础会话管理:利用thread_id实现多会话隔离,相同ID复用历史,不同ID创建独立会话 交互式终端实现:通过命令行指令支持会话切换、历史查看消息清空 记忆系统架构:Checkpointer自动管理会话轨迹,Store用于业务数据存储 开发调试方案:InMemorySaver适合本地测试,

微软技术分享 233

热门八股-JVM

本文系统梳理了JVM核心知识点,主要内容包括: 内存结构:详细解析JVM运行时数据区(程序计数器、虚拟机、堆等)及直接内存的特性与应用场景。 类加载机制:深入讲解双亲委派模型及其优缺点,分析打破委派的场景,并给出自定义类加载器实现方法。 垃圾回收:对比引用计数与可达性分析,解析分代收集原理(新生代复制算法/老年代标记整理),列举常见GC器特点,说明三色标记法原理。 实战调优:总结OOM类型与排查流程,提供FullGC、内存泄漏、CPU飙高等问题的诊断方法,介绍jstack/jmap等工具使用技巧。

2601_95495418的博客 152

CPU 100% 排查实战复盘:4步从确认到根治(附命令)

线上 CPU 100%、服务卡死,重启三次还是烧。很多人本能反应又是硬件不够了、加机器,结果过会儿又满。本文用 4 步法,从确认 CPU 打满到根治,每一步都讲清"为什么这么查",附可直接抄的命令。防汛防台巡检期,机房偏偏怕这种单核被打满的慢病。

ITyunwei0987的博客 252

Java面试题——JVM(二)

Java堆内存中,分代垃圾回收是一种常用的垃圾回收方式。其中,新生代主要负责存储短期存活的对象,老年代则主要存储长期存活的对象。新生代GC、老年代GC完全GC是三种不同的GC方式,它们的特点如表所示。 JDK预设的垃圾回收器的特点如表所示。 垃圾回收器的性能评估指标如表所示。 在JDK 17中,G1垃圾回收器是默认的垃圾回收器。G1垃圾回收器在JDK 7中首次被引入,并在随后的JDK版本中进行了改进优化。G1垃圾回收器是一个高效的垃圾回收器,其特点是可以高效地管理大内存、具有可预测的停顿时间高吞吐

吴声子夜歌的博客 201

大厂Java面试:Spring Boot、JVM、Redis、Kafka与Elasticsearch在内容社区UGC场景下的实战拷问

下一位,谢飞机。”面试官王工翻看着简历,头也不抬地说。谢飞机挺直腰板走进会议室,坐下后紧张地搓了搓手:“面试官好,我叫谢飞机,Java后端开发三年经验,主要做内容社区方向的业务。王工抬眼看了他一下:“三年经验,简历上写了Spring Boot、Redis、Kafka、Elasticsearch这些。那我们直接进入正题,你们社区的核心功能是什么?我们那套系统日活大概五十万,我负责的模块是内容发布动态流。王工点点头:“行,先从你熟悉的说起。

2602_95996092的博客 200

linux系统下XDMA驱动的安装与测试问题总结

先看两个常见的问题。一个是驱动安装问题,一个是驱动测试错误;error 512 能识别PCIE的设备,但是The kernel modle installed correctly, but no devices were recognized.

whm128的博客 3706

哈密尔顿时间序列分析

一本经典的时间序列分析书籍,大32开,1000多页,PDF格式。

上一篇: 为什么午后易犯困?如何缓解?
下一篇: JVM学习笔记3-垃圾回收算法
程序员的知识卡片
博客等级 码龄12年 82粉丝 · 6原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值