简单理解Java GC与幽灵引用

UE5新手必看:Gameplay框架中的GameInstance与子系统实战指南(含蓝图配置) 本文为UE5新手提供了Gameplay框架中GameInstance与子系统的实战指南。文章深入解析了GameInstance作为全局数据中枢的核心作用与生命周期,并手把手演示了如何创建自定义GameInstance、构建模块化的子系统(如存档管理),以实现跨关卡的持久数据管理。指南旨在帮助开发者构建清晰、可维护的项目架构,解决数据管理混乱的常见痛点。 阅读详情

转载地址:http://developer.51cto.com/art/200906/128189.htm

Java中一共有4种类型的引用:StrongReference、SoftReference、WeakReference以及PhantomReference (幽灵引用), 这 4 种类型的引用与Java GC有着密切的关系, 让我们逐一来看它们的定义和使用场景。

1. Strong Reference

StrongReference 是 Java 的默认引用实现,它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时Java GC 执行后将会被回收

@Test  
public void strongReference() {   
Object referent = new Object();   
   
/**  
 * 通过赋值创建 StrongReference   
 */  
Object strongReference = referent;   
   
assertSame(referent, strongReference);   
   
referent = null;   
System.gc();   
   
/**  
 * StrongReference 在 GC 后不会被回收  
 */  
assertNotNull(strongReference);   
}   
 
 @Test  
 public void strongReference() {  
  Object referent = new Object();  
    
  /**  
   * 通过赋值创建 StrongReference   
   */  
  Object strongReference = referent;  
    
  assertSame(referent, strongReference);  
    
  referent = null;  
  System.gc();  
    
  /**  
   * StrongReference 在 GC 后不会被回收  
   */  
  assertNotNull(strongReference);  
 }

2. WeakReference & WeakHashMap

WeakReference, 顾名思义,是一个弱引用,当所引用的对象在 JVM 内不再有强引用时, Java GC 后 weak reference 将会被自动回收

@Test  
public void weakReference() {   
Object referent = new Object();   
WeakReference<Object> weakRerference = new WeakReference<Object>(referent);   
 
assertSame(referent, weakRerference.get());   
   
referent = null;   
System.gc();   
   
/**  
 * 一旦没有指向 referent 的强引用, weak reference 在 GC 后会被自动回收  
 */  
assertNull(weakRerference.get());   
}   
 
 @Test  
 public void weakReference() {  
  Object referent = new Object();  
  WeakReference<Object> weakRerference = new WeakReference<Object>(referent);  
   
  assertSame(referent, weakRerference.get());  
    
  referent = null;  
  System.gc();  
    
  /**  
   * 一旦没有指向 referent 的强引用, weak reference 在 GC 后会被自动回收  
   */  
  assertNull(weakRerference.get());  
 }

WeakHashMap 使用 WeakReference 作为 key, 一旦没有指向 key 的强引用, WeakHashMap 在Java GC 后将自动删除相关的 entry

@Test  
public void weakHashMap() throws InterruptedException {   
Map<Object, Object> weakHashMap = new WeakHashMap<Object, Object>();   
Object key = new Object();   
Object value = new Object();   
weakHashMap.put(key, value);   
 
assertTrue(weakHashMap.containsValue(value));   
   
key = null;   
System.gc();   
   
/**  
 * 等待无效 entries 进入 ReferenceQueue 以便下一次调用 getTable 时被清理  
 */  
Thread.sleep(1000);   
   
/**  
 * 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry  
 */  
assertFalse(weakHashMap.containsValue(value));   
}   
 
 @Test  
 public void weakHashMap() throws InterruptedException {  
  Map<Object, Object> weakHashMap = new WeakHashMap<Object, Object>();  
  Object key = new Object();  
  Object value = new Object();  
  weakHashMap.put(key, value);  
   
  assertTrue(weakHashMap.containsValue(value));  
    
  key = null;  
  System.gc();  
    
  /**  
   * 等待无效 entries 进入 ReferenceQueue 以便下一次调用 getTable 时被清理  
   */  
  Thread.sleep(1000);  
    
  /**  
   * 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry  
   */  
  assertFalse(weakHashMap.containsValue(value));  
 }

3. SoftReference

SoftReference 于 WeakReference 的特性基本一致, 最大的区别在于 SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存应用

@Test  
public void softReference() {   
Object referent = new Object();   
SoftReference<Object> softRerference = new SoftReference<Object>(referent);   
 
assertNotNull(softRerference.get());   
   
referent = null;   
System.gc();   
   
/**  
 *soft references 只有在 jvm OutOfMemory 之前才会被回收, 所以它非常适合缓存应用  
 */  
assertNotNull(softRerference.get());   
}   
 
 @Test  
 public void softReference() {  
  Object referent = new Object();  
  SoftReference<Object> softRerference = new SoftReference<Object>(referent);  
   
  assertNotNull(softRerference.get());  
    
  referent = null;  
  System.gc();  
    
  /**  
   *soft references 只有在 jvm OutOfMemory 之前才会被回收, 所以它非常适合缓存应用  
   */  
  assertNotNull(softRerference.get());  
 }

4. PhantomReference

作为本文主角, Phantom Reference(幽灵引用) 与 WeakReference 和 SoftReference 有很大的不同,因为它的 get() 方法永远返回 null, 这也正是它名字的由来

@Test  
public void phantomReferenceAlwaysNull() {   
Object referent = new Object();   
PhantomReference<Object> phantomReference = new PhantomReference<Object>(referent, new ReferenceQueue<Object>());   
   
/**  
 * phantom reference 的 get 方法永远返回 null   
 */  
assertNull(phantomReference.get());   
}   
 
 @Test  
 public void phantomReferenceAlwaysNull() {  
  Object referent = new Object();  
  PhantomReference<Object> phantomReference = new PhantomReference<Object>(referent, new ReferenceQueue<Object>());  
    
  /**  
   * phantom reference 的 get 方法永远返回 null   
   */  
  assertNull(phantomReference.get());  
 }

诸位可能要问, 一个永远返回 null 的 reference 要来何用,请注意构造 PhantomReference 时的第二个参数 ReferenceQueue(事实上 WeakReference & SoftReference 也可以有这个参数),
PhantomReference 唯一的用处就是跟踪 referent何时被 enqueue 到 ReferenceQueue 中.

5. RererenceQueue

当一个 WeakReference 开始返回 null 时, 它所指向的对象已经准备被回收, 这时可以做一些合适的清理工作. 将一个 ReferenceQueue 传给一个 Reference 的构造函数, 当对象被回收时, 虚拟机会自动将这个对象插入到 ReferenceQueue 中, WeakHashMap 就是利用 ReferenceQueue 来清除 key 已经没有强引用的 entries.

@Test  
public void referenceQueue() throws InterruptedException {   
Object referent = new Object();  
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>();   
WeakReference<Object> weakReference = new WeakReference<Object>(referent, referenceQueue);   
   
assertFalse(weakReference.isEnqueued());   
Reference<? extends Object> polled = referenceQueue.poll();   
assertNull(polled);   
   
referent = null;   
System.gc();   
 
assertTrue(weakReference.isEnqueued());   
Reference<? extends Object> removed = referenceQueue.remove();   
assertNotNull(removed);   
}  
 
 @Test  
 public void referenceQueue() throws InterruptedException {  
  Object referent = new Object();    
  ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>();  
  WeakReference<Object> weakReference = new WeakReference<Object>(referent, referenceQueue);  
    
  assertFalse(weakReference.isEnqueued());  
  Reference<? extends Object> polled = referenceQueue.poll();  
  assertNull(polled);  
    
  referent = null;  
  System.gc();  
 
  assertTrue(weakReference.isEnqueued());  
  Reference<? extends Object> removed = referenceQueue.remove();  
  assertNotNull(removed);  
 }

6.PhantomReferencevs WeakReference

PhantomReference有两个好处, 其一, 它可以让我们准确地知道对象何时被从内存中删除, 这个特性可以被用于一些特殊的需求中(例如 Distributed GC,XWork 和 google-guice 中也使用 PhantomReference 做了一些清理性工作).

其二, 它可以避免 finalization 带来的一些根本性问题, 上文提到 PhantomReference 的唯一作用就是跟踪 referent 何时被 enqueue 到 ReferenceQueue 中,但是 WeakReference 也有对应的功能, 两者的区别到底在哪呢 ?
这就要说到 Object 的 finalize 方法, 此方法将在 gc 执行前被调用, 如果某个对象重载了 finalize 方法并故意在方法内创建本身的强引用,这将导致这一轮的 GC 无法回收这个对象并有可能
引起任意次 GC, 最后的结果就是明明 JVM 内有很多 Garbage 却 OutOfMemory, 使用 PhantomReference 就可以避免这个问题, 因为 PhantomReference 是在 finalize 方法执行后回收的,也就意味着此时已经不可能拿到原来的引用,也就不会出现上述问题,当然这是一个很极端的例子, 一般不会出现.

7. 对比

Soft vs Weak vs Phantom References
Type Purpose Use When GCed Implementing Class
Strong Reference An ordinary reference. Keeps objects alive as long as they are referenced. normal reference. Any object not pointed to can be reclaimed. default
Soft Reference Keeps objects alive provided there’s enough memory. to keep objects alive even after clients have removed their references (memory-sensitive caches), in case clients start asking for them again by key. After a first gc pass, the JVM decides it still needs to reclaim more space. java.lang.ref.SoftReference
Weak Reference Keeps objects alive only while they’re in use (reachable) by clients. Containers that automatically delete objects no longer in use. After gc determines the object is only weakly reachable java.lang.ref.WeakReference 
java.util.WeakHashMap
Phantom Reference Lets you clean up after finalization but before the space is reclaimed (replaces or augments the use offinalize()) Special clean up processing After finalization. java.lang.ref.PhantomReference


8. Java GC小结

8. Java GC小结
 一般的应用程序不会涉及到 Reference 编程, 但是了解这些知识会对理解Java GC 的工作原理以及性能调优有一定帮助, 在实现一些基础性设施比如缓存时也可能会用到, 希望本文能有所帮助.

数字IC物理验证实战 | 从Calibre LVS报告到Innovus定位的Debug全链路解析 本文详细解析了数字IC物理验证中Calibre LVS报告的Debug全流程,从INCORRECT NETS错误的初探到Innovus定位技巧,提供了实战案例和高效工具的使用方法。重点介绍了Calibre高亮功能、Innovus验证命令以及前后端工具联动的关键策略,帮助工程师快速定位和解决LVS问题,提升物理验证效率。 阅读详情

相关推荐

手把手教你使用Segformer训练自己的数据

SegFormer 基于Swin transformer 修改

weixin_38353277的博客 2万+

Java虚引用又称幽灵引用

1.概念 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个。一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获得一个对象实例。 2.说明 虚引用,正如其名,对一个对象而言,这个引用形同虚设,有和没有一样。 如果一个对象与GC Roots之间仅存在虚引用,则称这个对象为虚可达(phantom reachable)对象。 当试图通过虚引用的get()方法取得强引用时,总是会返回null,并且,虚引用必须和引用队列一

专业的计算机毕业设计指南 641

2.ROS实用工具:坐标变换

本文围绕ROS坐标变换展开,介绍其在机器人系统中的关键作用,即统一不同传感器和执行器坐标系,服务数据融合等操作。基于ROS的tf库,从广播和监听TF变换两方面阐述实现过程,涵盖新建工作包、编写广播和监听代码、配置构建文件及编译等步骤。此外,介绍启动节点管理器后运行广播和监听节点的方法,并通过rqt_graph、rqt_tf_tree、tf_echo等工具可视化和获取坐标系变换信息。借助这些内容,读者不仅能掌握ROS坐标变换的实现,还能对机器人坐标变换系统的调试和理解有更深入认识 。

qq_74168740的博客 1173

Java的幽灵引用定义与使用场景

<br /><br />Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵),<br />  这 4 种类型的引用与 GC 有着密切的关系,  让我们逐一来看它们的定义和使用场景 :<br />1. Strong Reference<br />  StrongReference 是 Java 的默认引用实现,  它会尽可能长时间的存活于 JVM 内, 当没有任何

cooliceman的专栏 955

半导体AMHS天车振动控制:从0.5G到超低振动的技术演进与工程实战

在先进晶圆厂中,自动化物料搬运系统(AMHS)的天车如同空中出租车,承担着晶圆盒(FOUP)在洁净室各工艺区间的转运任务。然而,当天车加减速、过弯或抓取时产生的机械振动通过轨道梁和建筑结构传递至光刻机等敏感设备,便可能直接威胁套刻精度与良率。传统被动减振方案依靠橡胶垫和弹簧,在0.5G指标时代曾行之有效,但在EUV光刻和先进制程面前已力不从心。主动振动控制技术通过传感器、控制器与作动器构成的闭环系统,在轨道吊点和机械手端实时输出反向力抵消振动,配合磁悬浮走行、轻量化结构及调度系统的路径优化,将振动从0.5G

weixin_29188043的博客 345

交换芯片数据通路四大核心微架构深度解析

数据通路是交换芯片性能的物理根基,决定着低延迟、高吞吐与突发承载能力。其本质是在硅片约束下对带宽、时序、功耗与统计复用的系统性权衡。Crossbar提供确定性低延迟但受RC延迟与功耗制约;VOQ通过虚拟队列隔离输出争抢,却引入仲裁复杂度与内存开销;Shared Buffer依托统计复用提升缓存利用率,但面临碎片化与管理策略挑战;Cell Fabric以固定长度cell重构交换粒度,在AI与金融等小包敏感场景实现尾延迟稳定。这些架构并非替代关系,而是面向不同网络不确定性(如流量不对称性、突发强度、包长分布)的

weixin_32667955的博客 189

java 幽灵引用_全面解析Java中的GC与幽灵引用

Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵),这 4 种类型的引用与 GC 有着密切的关系, 让我们逐一来看它们的定义和使用场景 :1、 Strong ReferenceStrongReference 是 Java 的默认引用实现, 它会尽...

weixin_39866419的博客 143

学Simulink--基于Simulink的无迹卡尔曼滤波(UKF)目标跟踪仿真建模示例

本文详细介绍了基于Simulink的无迹卡尔曼滤波(UKF)目标跟踪仿真建模方法。首先分析了UKF相比EKF在强非线性场景下的优势,包括无线性化误差、计算效率高和鲁棒性强等特点。接着阐述了UKF的核心原理,重点讲解了无迹变换(UT)的三个关键步骤:Sigma点生成、非线性传播和加权统计重构。文章还详细说明了二维机动目标的状态向量定义、非线性状态转移模型和雷达观测模型。 在Simulink实现部分,提供了完整的建模步骤和核心代码,包括目标运动模型、雷达传感器模型和UKF算法模块的实现。通过蛇形机动场景的仿真实

xiaoheshang_123的博客 89

Java引用类型分类以及详解

Java引用类型分类以及详解 - Java引用类型概述 在JVM之中再好的算法,也敌不过一个好烂的程序员。一个程序要想写好有两点:按照开发标准进行、请写有用代码。 而对于垃圾的产生与回收的处理之中,要想进行更好的控制,就必须清楚的掌握Java中的四种引用方式。 强引用(Strong Reference):即使进行了多次的GC回收,即使JVM真的已经不够用了,即使JVM最终不得已抛出了O...

wanghaoxin的博客 8245

硬核实战!Python爬虫从0到1完整版:爬取知乎热榜+回答内容(数据去重+Excel一键导出+避坑指南,零基础友好)

✔️ 适用人群:Python爬虫零基础、想练手实战爬虫、需要爬取知乎内容做数据分析、办公/学习素材整理的同学爬取知乎热榜全量数据(排名+标题+热榜链接+热度值) →自动跟进爬取每个热榜问题的回答内容(回答者昵称+赞同数+评论数+回答正文+发布时间) →数据清洗+智能去重→一键导出格式化Excel文件,所有功能一站式完成入门级难度,无复杂反爬破解、无分布式/代理池,纯requests请求+静态解析,新手能看懂、能运行、能修改;爬取速度快,热榜+回答全程仅需几十秒。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1461

【Flink on k8s】- 1 - Flink Kubernetes Operator 简介 2023

Flink Kubernetes Operator 可以与 Kubernetes 的其他功能和工具集成,可以帮助用户快速定位和解决问题。Flink Kubernetes Operator可以在Kubernetes上实现高可用性,以确保 Flink 集群的稳定性和可靠性。Flink Kubernetes Operator 可以快速地部署 Flink 集群,而无需手动配置和管理集群。Flink Kubernetes Operator可以将Flink集群与其他应用程序隔离,以避免资源争用和干扰。

欢迎来到我的博客,一起探索代码里的世界! 1348

强引用、软引用、弱引用、幻象引用有什么区别、具体使用场景

1. 强引用:项目中到处都是。2. 软引用:图片缓存框架中,“内存缓存”中的图片是以这种引用来保存,使得JVM在发生OOM之前,可以回收这部分缓存3. 虚引用:在静态内部类中,经常会使用虚引用。例如,一个类发送网络请求,承担callback的静态内部类,则常以虚引用的方式来保存外部类(宿主类)的引用,当外部类需要被JVM回收时,不会因为网络请求没有及时回来,导致外部类不能被回收,引起内存泄漏  ...

GuZhC的博客 1649

第一节:Vben Admin介绍和初次运行

本文是【实战Vben Admin + Python】的第一节,本文内容主要是介绍Vben Admin框架和我们后端使用的技术,开发环境和工具的准备本节文章的目的是Vben Admin的简单介绍,通过配置可以让项目前端运行起来,由于项目默认开启了mock,展示的都是静态模拟数据,我们在此基础上,下一节将研究分析下Vben Admin的目录。为我们后端搭建准备。

cuiwin的专栏 7416

java 幽灵引用_简单理解Java GC与幽灵引用

1. Strong ReferenceStrongReference 是 Java 的默认引用实现,它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时Java GC 执行后将会被回收@TestpublicvoidstrongReference(){Objectreferent=newObject();/***通过赋值创建StrongReference*/Objectstron...

weixin_35717696的博客 154

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java gc的使用_简单理解Java GC与幽灵引用

1. Strong ReferenceStrongReference 是 Java 的默认引用实现,它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时Java GC 执行后将会被回收@TestpublicvoidstrongReference(){Objectreferent=newObject();/***通过赋值创建StrongReference*/Objectstron...

weixin_39915668的博客 210

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

理解 Java 的 GC 与 幽灵引用 强引用,软引用以及弱引用

  转自: https://www.iteye.com/topic/401478,仅供学习记录 理解 Java 的 GC 与 幽灵引用             Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵),  这 4 种类型的引用与 GC ...

u013833031的博客 600

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java 幽灵引用_理解 Java 的 GC 与 幽灵引用

理解 Java 的 GC 与 幽灵引用Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵),这 4 种类型的引用与 GC 有着密切的关系, 让我们逐一来看它们的定义和使用场景 :1. Strong ReferenceStrongReference 是...

weixin_36296063的博客 123

[转]理解 Java 的 GC 与 幽灵引用

理解 Java 的 GC 与 幽灵引用           Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵), 这 4 种类型的引用与 GC 有着密切的关系,  让我们逐一来看它们的定义和使用场景 :        1. Strong Refere...

qjbtj999的博客 136

理解 Java 的 GC 与 幽灵引用

理解 Java 的 GC 与 幽灵引用             Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵),  这 4 种类型的引用与 GC 有着密切的关系,  让我们逐一来看它们的定义和使用场景 :         1. Str

大侠请留步 350

java 幽灵引用_理解Java的GC和幽灵引用

Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵), 这 4 种类型的引用与 GC 有着密切的关系, 让我们逐一来看它们的定义和使用场景 :1. Strong ReferenceStrongReference 是 Java 的默认引用实现, 它会尽...

weixin_29210727的博客 147
上一篇: java中垃圾回收机制(GC)
下一篇: 调优JVM内存,并解决OutOfMemoryError,StackOverflowError等异常问题
vba_2001
博客等级 码龄20年 35粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值