`

【Java核心-基础】引用(强引用、软引用、弱引用、幻象引用)

    博客分类:
  • Java
 
阅读更多

Java中的变量类型分为两大类:原始数据类型 和 引用类型。

 

引用类型分类

Java 中的引用分为“强引用”、“软引用”、“弱引用”、“幻象引用”。

这些分类体现了Java对象不同的可达性状态(reachable),是垃圾收集器决定如何处理对象的考虑因素之一。

分这么多类型,主要应用场景就是缓存(软引用、弱引用)。图片就是典型的缓存对象。

 

强引用

强引用就是最常见的普通对象引用。在垃圾收集(GC)中,对于一个对象,只要还有一个强引用指向该对象,就表明该对象还活着,GC不会去回收它。

 

软引用 

SoftReference

软引用是比强引用弱化一些的引用。可以让对象免于被某些GC操作回收。只有当 JVM 认为内存不足时(确保在OutOfMemoryError之前),才会试图回收软引用指向的对象

软引用一般用于实现内存敏感的缓存。即,如果还有空闲内存,则暂时保留缓存;当内存不足时,可以被清理掉。这样既可以使用缓存,又不会因缓存数据过多而耗尽内存。

如,在内存实现对图片数据的缓存。

 

弱引用

WeakReference

弱引用机制仅仅是提供一种途径来访问处于弱引用状态的对象。它不能让对象免于被回收。也可以用该机制实现缓存。

 

幻象引用

PhantomReference

幻象引用也译作虚引用。该机制仅仅是确保对象被 finalize 后,再执行某些操作。

 

对象可达性状态转换

 

与引用队列(ReferenceQueue)结合使用

软引用、弱引用、幻象引用都可以和引用队列(ReferenceQueue)结合使用,以便实现一些自定义的功能。

可以在创建引用时指定ReferenceQueue,当此引用所指对象的可达性变成对应的等级时,此引用会被添加到指定的ReferenceQueue中。

“可达性等级改变”是指可以通过相应等级的引用访问对象,但无法通过更高等级的引用访问。

如,“弱引用可达”是指可通过弱引用访问对象,但该对象的软引用和强引用都无法访问它。

 

例,对一个幻象引用采用这种使用方法:

Object obj = new Object();
ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
PhantomReference<Object> pRef = new PhantomReference<>(obj, refQueue);
obj = null;
System.gc();
try {
  Reference<Object> ref = refQueue.remove(1000);
  if (null != ref) {
    // 执行自定义操作
  }
} catch (InterruptedException e) {
  // 处理异常
}
  • 大小: 30.3 KB
分享到:
评论

相关推荐

    强应用软引用弱引用与垃圾收集的关系1

    本文将深入探讨强引用、软引用、弱引用以及幻象引用这四种引用类型,以及它们与垃圾收集的关系。 1. **强引用(Strong Reference)**: - 强引用是Java中最常见的引用类型,它代表了一个对象的直接访问路径。只要...

    强引用、软引用、弱引用、虚引用1

    从Java SE2开始,Java引入了四种不同类型的引用:强引用、软引用、弱引用和虚引用,它们各自具有不同的特点和用途,有助于程序员更精细地控制对象的生命周期,并优化垃圾回收过程。 1. 强引用(Strong Reference) ...

    Java引用类型1

    Java提供了四种不同级别的引用类型:强引用、软引用、弱引用和虚引用(幻象引用),每种引用类型在内存管理中有不同的作用。 1. **强引用(Strong Reference)** - 强引用是最常见的引用类型,即通常的变量赋值。...

    程序避免被GC 回收 --------引用

    弱引用比软引用更弱一些,只要发生垃圾回收,不管当前内存是否足够,都会回收弱引用指向的对象。弱引用主要用来实现更细粒度的缓存,当不再需要缓存时,可以立即释放其占用的内存。 ### 幻象引用(Phantom ...

    Android利用软引用和弱引用避免OOM的方法

    为了优化内存使用,Java引入了不同级别的引用类型,包括强引用、软引用、弱引用和虚引用。这些引用类型帮助开发者更好地控制对象的生命周期,并在必要时协助垃圾回收机制。 1. **强引用(Strong Reference)** - ...

    深入探讨 java-lang-ref 包.docx

    弱引用和软引用在内存不足时能帮助系统更有效地回收资源,而幻象引用则允许在对象即将被彻底回收前执行必要的清理操作。理解并灵活运用这些引用类型,能够帮助开发者编写出更加高效、内存友好的Java程序。

    求职宝典-Java 基础面试题

    Java 基础面试题是求职者在面试Java开发岗位时常常遇到的挑战。这些题目旨在测试应聘者的编程基础、设计原则以及对Java特性的理解。以下是对几个关键知识点的详细解释: 1. **设计模式**: 设计模式是解决软件设计...

    面试官:详细谈谈Java对象的4种引用方式

    在 Java 中,对象的引用方式有四种:强引用、软引用、弱引用和幻象引用。这些引用方式的使用场景和特点是不同的,下面我们详细介绍每种引用方式的特点和使用场景。 强引用 强引用是最常用的引用方式,通过 new ...

    深入探讨 java.lang.ref 包1

    弱引用(WeakReference)比软引用更弱,它不会阻止对象被垃圾回收,无论内存状况如何。一旦所有指向对象的弱引用都被清除,垃圾回收器将在下一次回收周期中立即回收该对象。弱引用常用于创建非必需的缓存,例如: `...

    java内存管理问题及解决办法

    4. 虚引用(Phantom Reference):也称为幽灵引用或幻象引用,它是最弱的一种引用关系,虚引用对象的存在不会阻止对象被垃圾回收,但它可以提供一个回调机制,让你在对象被回收之前做一些清理工作。 解决内存泄漏的...

    从面试题中看java的Reference(引用)

    在Java中,引用被分为四种不同的类型:强引用、软引用、弱引用和虚引用,这些引用类型允许程序员对对象的可达性进行更精细的控制。 1. 强引用(Strong Reference): 强引用是最常见的引用类型,通过`new`关键字...

    java面试经典100题

    Java 5引入了四种不同的引用类型,它们分别是强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。每种引用类型在内存管理和垃圾回收上有不同的特点: ...

    面试题 Java 基础总结了经常会被面试官问的问题

    - **强引用、弱引用、虚引用和幻象引⽤**:不同类型的引用强度,影响垃圾收集。 - **final、finally 和 finalize()**:final修饰变量和方法,finally保证代码块执行,finalize()清理资源。 - **内部类**:包括...

    视觉幻象-3d恐龙

    ### 视觉幻象-3d恐龙:探索折纸艺术与光学错觉的结合 #### 视觉幻象概述 视觉幻象是指那些利用特定设计或构造方式来欺骗人眼,使人产生错误感知的现象。这类现象广泛存在于自然界、艺术创作以及现代科技产品中。在...

    java与C#区别详细介绍1 (2).pdf

    - **弱引用**:Java 和 C# 都支持弱引用,允许对象在不再被强引用时被垃圾收集。 - **软引用** 和 **幻象引用**:这是 Java 特有的,用于内存敏感的缓存策略。C# 没有直接的对应概念,但可以通过实现特定接口模拟...

    垃圾回收相关概念.pdf

    - **软引用**:用于实现内存敏感的缓存,当内存不足时,垃圾收集器会清理软引用,将其对应的对象回收。 - **弱引用**:不会阻止对象被垃圾收集,只要垃圾收集器运行,弱引用关联的对象就会被回收。 - **虚引用**...

    行业-电子政务-幻象电源供电麦克风的远程控制.zip

    幻象电源供电麦克风是一种广泛应用的专业音频设备,尤其在会议系统、远程视频会议和指挥中心等场合。这种麦克风通过使用幻象电源(Phantom Power)来提供所需的操作电力,使得无需额外的电池或外部电源,简化了安装...

    行业-电子政务-幻象电源供电传声器的电源.zip

    在"幻象电源供电传声器的电源.pdf"这份文档中,可能涵盖了幻象电源的工作原理、电容式麦克风的构造、电源标准、设备选择指南以及如何在实际应用中正确配置和使用幻象电源等内容。对于电子政务领域的技术人员来说,...

    java与C#区别详细介绍1.pdf

    C# 支持垃圾回收,同时有弱引用、软引用和幻象引用的概念,提供了更精细的内存管理。 3. 类和接口: - Java 允许类、接口和抽象类。访问修饰符包括公共、包级私有、受保护和私有。Java 不支持内联类(即 C# 的匿名...

    内存泄漏问题\防范JAVA内存泄漏解决方案

    4. 使用弱引用、软引用或幻象引用来管理对象时,如果不正确处理,也可能导致内存泄漏。 解决Java内存泄漏的方法主要包括: 1. 及时清除不再使用的对象引用,如从集合中移除对象,将变量设为null。 2. 避免使用静态...

Global site tag (gtag.js) - Google Analytics