java gc通过可达性分析判断对象是否可回收:从gc roots出发,不可达的对象被标记为可回收;强引用最刚性,内存溢出也不回收;软引用在内存不足时回收,适合缓存;弱引用每次gc都回收,用于weakhashmap等场景;虚引用无法获取对象,仅配合referencequeue监听回收完成事件。

Java 垃圾回收(GC)判断一个对象是否可回收,核心依据是可达性分析:从 GC Roots 出发,能被直接或间接引用到的对象被视为“存活”,其余则标记为可回收。而四种引用类型,本质上就是对“间接引用强度”的分级定义——它们不改变 GC Roots 本身,但决定了当对象仅通过某类引用与 Roots 连接时,GC 是否、以及何时切断这条路径。
强引用:默认绑定,绝不放手
Object obj = new Object(); 就是典型的强引用。只要 obj 变量还持有该对象(未置 null、未出作用域),这个对象就始终算作“从 GC Roots 可达”,GC 绝不会回收它。哪怕内存耗尽抛出 OutOfMemoryError,也不会动它。这是最刚性的引用,也是内存泄漏最常见的源头——比如静态集合长期持有着本该销毁的 Activity 实例。
软引用:内存告急时的缓冲带
SoftReference softRef = new SoftReference(bitmap); 表示这个 Bitmap 是“有用但非必需”的。JVM 会尽量保留它,直到真正要 OOM 之前,才把所有软引用对象列进回收队列。它天然适合做缓存:图片、解析结果等,既想提速,又不愿因缓存撑爆内存。注意:软引用不是“OOM 前一秒才回收”,而是 GC 在判定内存不足后的一次性清理动作,时机由 JVM 决定。
js2java
JavaScript 到 Java 全栈翻译助手,专为前端开发者学习 Java 或快速实现后端业务逻辑而设计。当用户提到以下场景时必须使用此技能: - "帮我把这段 JS 代码转成 Java" - "用 Java 怎么写这个逻辑" - "我习惯用 JS 写,想翻译成 Java" - "教我 Java,我要写后端接...
下载
弱引用:GC 来了就走,不讲条件
WeakReference weakRef = new WeakReference(str); 只要发生一次 GC,无论内存多富裕,这个 str 对象都会被回收。WeakHashMap 的键就是靠弱引用实现的——当 key 对象本身被回收,对应的 entry 就自动失效,避免了因 key 泄漏导致整个 Map 占用不释放。使用时务必判空:weakRef.get() 可能随时返回 null。
虚引用:只通知,不挽留
PhantomReference
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南