CodeGym /课程 /Java 语法 /对象生存期

对象生存期

Java 语法
第 6 级 , 课程 4
可用

“我还想告诉你一些有关对象生存期的趣事。在 Java 中,很难意外销毁某个对象。如果你引用了某个对象,则该对象处于存活状态。

你不能更改对对象的引用,也不能增加或减少这些引用。另外,你也不能创建对某个对象的引用。你只能对引用赋值或将其设置为 null。”

“我想我听懂了,艾莉。那么,如果我删除对某个对象的所有引用(或设置为 null),我将再也无法获得对该对象的引用或访问该对象,对吗?”

“是的。但是,你也可能会遇到系统有太多未使用的存活对象的情况。程序员经常创建几十个对象,将其存储在各种列表中等待处理,却从不清空这些列表。

程序员不需要的对象通常直接被标记为符合垃圾回收条件。没有人会从列表中删除它们。结果,随着越来越多的未使用对象保留在内存中,大型 Java 程序通常会变得很庞大。

你不会很快遇到这种情况,但是每次我都会提醒你注意这些未使用的对象以及正确的处理方式。”

“好的。艾莉,谢谢你帮助我更好地理解了引用。”

评论 (13)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Henry Lee 级别 7,Tokyo,Japan
6 二月 2025
在Java中,对象的生命周期与引用有关。这是否意味着有引用的对象永远都不会被GC回收? ChatGPT: 在 Java 中,对象的生命周期确实与引用类型相关,但 "有引用的对象永远不会被 GC 回收" 这个说法并不完全正确。Java 的垃圾回收(GC)机制依赖于可达性分析(Reachability Analysis),而不仅仅是“有引用”这一条件。 Java 对象何时会被 GC 回收? GC 主要依据对象的可达性来判断是否可以回收,而不是单纯地看对象是否有引用。一个对象如果不再被任何“可达的”引用链所引用,就会成为垃圾回收的候选对象。 关键点: 强引用(Strong Reference) 普通的对象引用(如 new Object() 赋值给变量)属于强引用。 只要一个对象有强引用,即便是孤立对象环(相互引用但外界不可达),GC 也不会回收它。 例如: java コピーする 編集する Object obj = new Object(); // 只要 obj 还可达,对象不会被回收 obj = null; // 现在对象变为不可达,可被 GC 回收 软引用(Soft Reference) SoftReference<T>(软引用)用于缓存,GC 在内存不足时才会回收。 适用于缓存对象的场景。 弱引用(Weak Reference) WeakReference<T>(弱引用)对象在下次 GC 时会被直接回收。 常用于缓存和避免内存泄漏,如 WeakHashMap。 虚引用(Phantom Reference) PhantomReference<T>(虚引用)不会影响对象回收,仅用于监控对象的回收,通常配合 ReferenceQueue 进行清理操作。 误区澄清: 即使对象仍然被某个引用变量引用,它也可能被 GC 回收,如果该引用变量本身已经不可达(例如方法执行完毕后局部变量消失)。 类加载器泄漏和静态变量持有对象可能会导致对象长时间不被回收,需要手动处理。 自定义类加载器持有对象可能导致内存泄漏,因为类加载器只有在卸载时才会释放它加载的类及其静态成员。 结论: “有引用的对象不会被 GC 回收” 是不正确的。对象的回收取决于是否从 GC Roots 可达,如果所有引用都不可达(即便有对象之间的相互引用),GC 依然会回收它。
Gould 级别 10,Guangzhou,China
10 七月 2024
以下是对《Course Java 语法 - Lecture: 对象生存期》文档内容的详尽笔记整理: ### 标题 - **Course Java 语法 - Lecture: 对象生存期** ### 链接 - [Course Java 语法 - Lecture: 对象生存期](https://codegym.cc/zh/quests/lectures/zh.questsyntax.level06.lecture04) ### 核心概念 - **对象生存期**:在Java中,对象的生命周期与引用相关。 ### 引用与对象的关系 - **引用的不可变性**:不能更改对对象的引用,不能增加或减少引用的数量。 - **引用的操作限制**:只能对引用赋值或将其设置为null。 ### 对象的存活状态 - **存活状态**:如果引用了某个对象,则该对象处于存活状态。 - **引用的删除**:删除所有引用或将引用设置为null,对象将无法被访问。 ### 垃圾回收 - **垃圾回收条件**:程序员不需要的对象会被标记为垃圾回收的条件。 - **内存管理问题**:由于程序员可能忘记从列表中删除不再需要的对象,导致内存中保留大量未使用对象。 ### 内存占用问题 - **大型程序的内存问题**:随着未使用对象的累积,大型Java程序可能会变得庞大。 ### 程序员的注意事项 - **注意未使用的对象**:提醒程序员注意内存中的未使用对象,并采取正确的处理方式。 ### 结尾 - **感谢与理解**:用户对艾莉的帮助表示感谢,并表示更好地理解了引用的概念。 这些笔记概括了文档中讨论的关于Java对象生存期的基本概念和注意事项,强调了引用管理在Java内存管理中的重要性。
哄哄 级别 22,Nanping,China
28 十一月 2024
直接把链接丢给GPT吗
Anonymous #11443734 级别 22,Russia,Russian Federation
18 一月 2024
冲啊
拔萝卜滴🐰 级别 22,chengdu,China Expert
30 一月 2023
今日目标:冲9级!
Qin-1999 级别 22
28 十二月 2023
恭喜到达22级
Murphy 级别 12,Шанхай,China
13 五月 2022
>>你不能更改对对象的引用,也不能增加或减少这些引用。另外,你也不能创建对某个对象的引用。 这句话不理解。 假设 1:Object a = new Object(); 2:a = new Object(); 3:b = a; a是对对象的引用,step 2把a指向另一个对象,不是更改了对对象的引用吗? step 3让b和a引用同一个对象,不是增加了对对象的引用吗?
且听风吟 级别 11,China
29 七月 2021
Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做2件基本的事情:(1)找到所有存活对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用 引用计数法 可达性分析(根搜索算法)
倏忽 级别 6,United States of America,United States
15 一月 2022
感谢大佬科普😸
Leo 级别 15,Seattle,United Kingdom
5 四月 2021
giao~giao~
Lerer 级别 7,Tokyo,Japan
8 八月 2020
加油
bluebloodtk 级别 7,Guangzhou,China
20 五月 2020
giao~
szlovech 级别 18,Tokyo,Chinese
11 五月 2020
一起加油~