Java引用总结–StrongReference、SoftReference、WeakReference、PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引用,...软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。...弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。...下面,先通过实例对内存回收有个认识;然后,进一步通过引用实例加深对引用的了解。...,对java.util.Date类进行了扩展,并重写了finalize()和toString()方法。
背景 最近读了寒泉子关于Finalizer的分享 JVM源码分析之FinalReference完全解读 - InfoQ 结合之前对java引用类型的了解,突然想到几个开脑洞的问题: 如果一个对象没有强引用...PhantomReference进入队列;并且第一次GC后WeakReference和PhantomReference就get不到对象了 实验二 为了触发软引用,我们需要申请一块大内存,看下面改造后的main...null java.lang.ref.PhantomReference@1d4c9154 get null>> 第一次gc << 可以看到WeakReference和SoftReference放入队列后...,PhantomReference也进入队列 结论 到此基本上对整个过程比较清楚了,可以回答开篇的问题 SoftReference只有在内存不足的时候才会放到队列,和WeakReference放入队列的先后顺序是随机的...的实现 无论那种方式,其实都不推荐用来关闭资源,因为虚拟机规范不保证一定能够执行,所以只能用来补救 疑问 最后还有一点疑问,WeakReference和SoftReference进入队列先后顺序怎么确定
一文读懂java中的Reference和引用类型 简介 java中有值类型也有引用类型,引用类型一般是针对于java中对象来说的,今天介绍一下java中的引用类型。...java为引用类型专门定义了一个类叫做Reference。Reference是跟java垃圾回收机制息息相关的类,通过探讨Reference的实现可以更加深入的理解java的垃圾回收是怎么工作的。...弱引用weak Reference weakReference和softReference很类似,不同的是weekReference引用的对象只要垃圾回收执行,就会被回收,而不管是否内存不足。...和SoftReference和WeakReference不同的是,PhantomReference只有一个构造函数,必须传入ReferenceQueue: public PhantomReference...} Reference和ReferenceQueue 讲完上面的四种引用,接下来我们谈一下他们的父类Reference和ReferenceQueue的作用。
简介 java中有值类型也有引用类型,引用类型一般是针对于java中对象来说的,今天介绍一下java中的引用类型。 java为引用类型专门定义了一个类叫做Reference。...Reference是跟java垃圾回收机制息息相关的类,通过探讨Reference的实现可以更加深入的理解java的垃圾回收是怎么工作的。...弱引用weak Reference weakReference和softReference很类似,不同的是weekReference引用的对象只要垃圾回收执行,就会被回收,而不管是否内存不足。...和SoftReference和WeakReference不同的是,PhantomReference只有一个构造函数,必须传入ReferenceQueue: public PhantomReference...} Reference和ReferenceQueue 讲完上面的四种引用,接下来我们谈一下他们的父类Reference和ReferenceQueue的作用。
创建一个软引用的代码示例: 1 SoftReference soft = new SoftReference("World"); SoftReference类的结构如下: 1 2...创建一个弱引用的代码示例: 1 WeakReference weakName = new WeakReference("hello"); WeakReference类的结构如下...> pr = new PhantomReference(new String("hello"), queue); PhantomReference类的结构如下: 1 2 3 java.lang.ref.PhantomReference...刚才分析四种引用的时候看到,java.lang.ref.Reference 为 软(soft)引用、弱(weak)引用、虚(phantom)引用的父类。...#ensureClassInitialized java.lang.ref.Reference.ReferenceHandler#run 这个线程在Reference类的static的构造块中启动,
Java中的四种引用 Java中有四种引用类型:强引用、软引用、弱引用、虚引用。...Java为什么要设计这四种引用 Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。...我们可以手动把关联给中断了,方法也特别简单: o = null; 我们可以手动调用GC,看看如果强引用和对象之间的关联被中断了,资源会不会被回收,为了更方便、更清楚的观察到回收的情况,我们需要新写一个类...弱引用 弱引用的使用和软引用类似,只是关键字变成了WeakReference: WeakReference weakReference = new WeakReference... reference = new PhantomReference(new byte[1], queue); System.out.println(reference.get
Jva中的引用 Java中提供了四个级别的引用,强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference...软引用 软引用是除了强引用外,最强的引用类型。用来描述一些还有用但是并非必须的对象,在Java中用java.lang.ref.SoftReference类来表示。...也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。...软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。...图片.png 弱引用 在java中,可以用java.lang.ref.WeakReference实例来保存对一个Java对象的弱引用。
强引用、软引用、弱引用、虚引用 从Jdk1.2开始,在java.lang.ref包下就提供了三个类:SoftReference(软引用),PhantomReference(虚引用)和WeakReference...因此java语言对对象的引用有如下四种: 强引用:就是正常的引用。...WeakReference reference = new WeakReference(object); object = null; 虚引用:和弱引用一样,会直接被GC清理,而且通过虚引用的get方法不会得到对象的引用...PhantomReference refernce = new PhantomReference(object); object = null; 1 强引用和软引用的区别 软引用只有在内存不足的时候才会被清理...弱引用和虚引用的区别就在于被加入队列的条件不同,这里主要侧重于考虑对象所属的类重写了finalize方法,将对象的状态归纳为三种:finalizable, finalized、reclaimed,分别代表
强引用 特点 强引用是较为普遍的一种引用,在我们编写Java代码时,绝大多数的引用,使用的都是强引用。...代码示例 import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue...; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit...且在Java源码中有较多的应用场景,如ThreadLocal使用的就是弱引用。...希望本文能够帮助小伙伴们对Java的四种引用类型有更深入的了解。
// @since 1.2 public abstract class Reference { // 构造函数是非public的 所以只能通包内的类才能访问此构造函数 Reference...也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。... extends Reference { // 仅仅提供了两个构造方法而已,注意它的get方法在父类Reference上 public WeakReference(T referent...---- 虚引用 虚引用(PhantomReference):虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期(java对象的生命周期)。...当然我们也可以自定义一个基于WeakReference或者SoftReference的缓存结构,有兴趣自定义的可以参考这个示例:java中SoftReference与WeakReference应用于高速缓存示例
文章目录 1. java对象分配和gc的简单介绍 2.四种基本的Reference 2.1 Strong Reference (强引用) 2.2 Soft Reference 软引用 2.3 Weak...Reference 弱引用 2.4 Phantom Reference 虚引用 1. java对象分配和gc的简单介绍 在Java中,一切对象都只能通过new进行实例化。...这就是本文需要讨论的重点,java中的Reference。 2.四种基本的Reference 为了理解java中的Reference,那么我们先来看一个例子。...2.2 Soft Reference 软引用 通过java.lang.ref.SoftReference能够创建一个软引用。...2.3 Weak Reference 弱引用 弱引用可以通过java.lang.ref.WeakReference进行实现。弱引用一旦对该对象的强引用消失,GC的时候就会立即回收。
Final Reference 当前类是否是finalizer类,注意这里finalizer是由JVM来标志的( 后面简称f类 ),并不是指java.lang.ref.Finalizer类。...但是f类是会被JVM注册到java.lang.ref.Finalizer类中的。 ① 当前类或父类中含有一个参数为空,返回值为void的名为finalize的方法。...对于软引用关联着的对象,如果内存充足,则垃圾回收器不会回收该对象,如果内存不够了,就会回收这些对象的内存。在 JDK 1.2 之后,提供了 SoftReference 类来实现软引用。...注意:Java 垃圾回收器准备对SoftReference所指向的对象进行回收时,调用对象的 finalize() 方法之前,SoftReference对象自身会被加入到这个 ReferenceQueue...注意:Java 垃圾回收器准备对WeakReference所指向的对象进行回收时,调用对象的 finalize() 方法之前,WeakReference对象自身会被加入到这个 ReferenceQueue
运行时常量池(Runtime Constant Pool):方法区的一部分,存放编译器生成的各种字面值和符号引用。...Java堆与方法区,只有在程序运行期间才知道会创建哪些对象,这部分内存的分配和回收都是动态的。...JDK1.2之后,提供了 SoftReference类实现软引用。...JDK1.2之后,提供了 WeakReference类实现软引用。...为一个对象设置虚引用关联的唯一目的,就是能够在这个对象被GC回收时,收到一个系统通知。JDK1.2之后,提供了 PhantomReference类实现软引用。
一,四种引用介绍 从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。...软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。...弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。...import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue; public class Main { public...; } } 程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。
Java 2 平台引入了 java.lang.ref 包,这个包下面包含了几个Reference相关的类,Reference相关类将Java中的引用也映射成一个对象,这些类还提供了与垃圾收集器(garbage...Reference引用类的几种类型 在jvm中,一个对象如果不再被使用就会被当做垃圾给回收掉,判断一个对象是否是垃圾,通常有两种方法:引用计数法和可达性分析法。...关于WeakReference,Java中一个比较典型的应用就是:WeakHashMap。关于这个类的使用情况大家可以参考这篇文章。...虚引用(PhantomReference) 虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。...如果有被回收的引用,进行一些操作。 引用队列(ReferenceQueue) 作为一个Java对象,SoftReference对象除了具有保存软引用的特殊性之外,也具有Java对象的一般性。
简介 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用,下面分别介绍下这四种引用。...,可以参考WeakHashMap类。...虚引用 虚引用是使用PhantomReference创建的,它是所以引用类型中最弱的。虚引用对象和没有引用的对象相同,可以在任何时候被垃圾回收,并且虚引用必须要与引用队列一起使用。...():" + phantomReference.get()); //轮询此队列,查看是否有可用的Reference对象,有则返回该对象,否则返回null System.out.println...------ * phantomReference.get():null * referenceQueue.poll():java.lang.ref.PhantomReference@76fb509a
首先要大致了解 Java 的几种引用类型。如下图所示,JDK 1.2 之后新增了 Reference 的概念,给开发人员提供了与 GC 交互的一种渠道。...《深入理解 Java 虚拟机》中对于几种引用类型做了简要的描述: 强引用(_Strongly Reference_ )是最传统的「引用」的定义,是指在程序代码中普遍存在的引用赋值,即类似 Object...---- PhantomReference PhantomReference 在使用方法上与 SoftReference、WeakReference 稍有不同,查看它的源码: public class...= null; 通过注释能够了解到,它的作用是维护一个链表,链表中的对象是待入队(放入 queue 中)的 Reference 对象。...总结一下清理的原理: 随着Reference 类被加载,Reference-handler 后台线程被启动,它轮循 pending 链表,执行 Cleaner 的 clean 工作。
从 JDK1.2 版本开始,Java 把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。...sr = new SoftReference(prev); // 重新构建 } 3、弱引用(Weak Reference) 简单来说,就是将对象留在内存的能力不是那么强的引用。...使用场景: 在下面的代码中,如果类 B 不是虚引用类 A 的话,执行 main 方法会出现内存泄漏的问题, 因为类 B 依然依赖于 A。...虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。...一般可以通过虚引用达到回收一些非java内的一些资源比如堆外内存的行为。
虚引用和软引用的一个区别是,虚引用必须和引用队列(ReferenceQueue)联合使用。... softReference = new SoftReference(str); 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收...(); } 代表软引用的类:java.lang.ref.SoftReference 代表弱引用的类:java.lang.ref.WeakReference 代表虚引用的类:java.lang.ref.PhantomReference...他们同时继承了:java.lang.ref.Reference public static void soft() throws Exception { Object obj = new...当然,还有一个最后的状态,就是不可达(unreachable),意味着对象可以被清除了。 Java中4种引用的级别和强度由高到低依次为:强引用 -> 软引用 -> 弱引用 -> 虚引用
https://blog.csdn.net/gdutxiaoxu/article/details/80738581 java 源码系列 - 带你读懂 Reference 和 ReferenceQueue...我们都知道在Java中有4种引用,这四种引用从高到低分别为: 1) StrongReference 这个引用在Java中没有相应的类与之对应,但是强引用比较普遍,例如:Object obj = new...这也就说明了当内存充足的时候一个对象只有软引用也不会被JVM回收。 3) WeakReference WeakReference 基本与SoftReference 类似,只是回收的策略不同。...注意:PhantomReference必须要和ReferenceQueue联合使用,SoftReference和WeakReference可以选择和ReferenceQueue联合使用也可以不选择,这使他们的区别之一...---- 总结 Refrence 和引用队列 ReferenceQueue 联合使用时,如果 Refrence持有的对象被垃圾回收,Java 虚拟机就会把这个弱引用加入到与之关联的引用队列中。
领取专属 10元无门槛券
手把手带您无忧上云