首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java引用(WeakReferences)

前一段时间当我面试有些来应聘高级java开发工程师岗位的候选人时,在我问的众多问题中,有个问题是“你能告诉我引用是啥吗”,我不期望得到像论文中的细节一样的答案。...我不确定为啥这个知识点鲜为人知,但自Java1.2之后发布的引用确实是有个非常有用的功能。   虽然作为一个java工程师我不建议你成为引用的专家,但我认为你至少应该知道他们是啥。...各种不同强度的应用 Different degrees of weakness   除了上面我提到的引用外,其实java总共有4中不同的引用,其引用强度从强到分别是强应用、软引用引用、虚引用。...但这确实是事实,好多java程序猿真的不了解引用,而且也需要学习下。我希望你能从这篇文章学到一些东西。...参考资料 Understanding Weak References(原文) 理解Java中的引用

55911

java学习引用类型之引用

Java中,引用是一种比软引用更弱的引用类型。引用对象的生命周期更短暂,当垃圾回收器进行垃圾回收时,如果一个对象只被引用引用,那么该对象会被回收。...Java提供了java.lang.ref.WeakReference类来创建引用对象。...引用Java中有以下几个主要的应用场景和用途:缓存:引用可以用于实现缓存。当我们需要缓存一些对象,但又不想让这些对象长时间占用内存时,可以使用引用引用这些对象。...引用和软引用Java中两种不同的引用类型,它们之间有以下几个区别:生命周期:引用的生命周期更短暂。当垃圾回收器进行垃圾回收时,如果一个对象只被引用引用,那么该对象会被回收。...请注意,无论是引用还是软引用,它们都可以通过java.lang.ref.WeakReference和java.lang.ref.SoftReference类来创建。

25730
您找到你想要的搜索结果了吗?
是的
没有找到

Java的强引用、软引用引用、虚引用

它底层实现和API接口上使用了强引用、软引用引用。所以温故知新下,也夯实下基础。...引用 引用是发生了一次垃圾回收后,既存的引用对象就开始回收。通常,一个引用对象仅能生存到下一次垃圾回收前。 用实验说明一下,为了防止JVM自动调整堆大小,我们把堆设置-Xmx200M。...Java的Unsafe类和NIO都可以直接访问堆外内存。堆外内存GC管不了,这时候虚引用就排上用场了。我们可以通过引用队列跟踪垃圾回收,做好善后。...当显示设置为软引用或者引用时,运行时GC触发和对象回收之间的关系和自己手动直接测试的结果是一样的,大家可以动手实践下。...总结 Java的强软弱虚引用被回收的时机不同:强引用引用被释放才会回收;软引用是没释放,但是快OOM了就会被回收;引用引用没释放,但是发生了GC后就会被回收;虚引用随时会回收,好像没有存在过,但是会有一个队列来跟踪它的垃圾回收情况

2K31

Java引用类型:强引用,软引用引用,虚引用

Java中提供了4个级别的引用:强引用,软引用引用,虚引用。在这4个引用级别中,只有强引用FinalReference类是包内可见,其他3中引用类型均为public,可以在应用程序中直接使用。...强引用 Java中的引用,有点像C++的指针,通过引用,可以对堆中的对象进行操作。...这时候显式置null的作用不大,只要在我们的方法退出,即该栈桢从Java虚拟机栈弹出时,o指向Object的引用就断开了,此时Object在堆上分配的内存在GC时就能被回收。...引用 引用时一种比软引用较弱的引用类型。...当试图通过虚引用的get()方法取得强引用时,总会失败。并且,虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。

2.2K31

Java基础 之软引用引用、虚引用

引用可以和一个引用队列(ReferenceQueue)联 合使用,如果软引用引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中 4、引用(WeakReference)   ...引用与软引用的区别在于:只具有引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有引用的对象,不管当前内存空间足够与否,都会回收它的内存。...引用可以和一个引用队列(ReferenceQueue)联合使用,如果引用引用的对象被垃圾回 收,Java虚拟机就会把这个引用加入到与之关联的引用队列中。    ...6、相关应用   在java.lang.ref包中提供了三个类:SoftReference类、WeakReference类和PhantomReference类,它 们分别代表软引用引用和虚引用。...8.2如何使用WeakHashMap      在Java集合中有一种特殊的Map类型—WeakHashMap,在这种Map中存放了键对象的引用,当一个键对象被垃圾回收器回收时,那么相应的值 对象的引用会从

91040

Java 的强引用引用、软引用、虚引用

引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。...3、引用(WeakReference)       引用与软引用的区别在于:只具有引用的对象拥有更短暂的生命周期。...下面的代码会让str再次变为一个强引用:     String abc = abcWeakRef.get();     引用可以和一个引用队列(ReferenceQueue)联合使用,如果引用引用的对象被垃圾回收...,Java虚拟机就会把这个引用加入到与之关联的引用队列中。...5、总结     Java4种引用的级别由高到低依次为: 强引用  >  软引用  >  引用  >  虚引用     通过图来看一下他们之间在垃圾回收时的区别: ?

3.6K30

Java 的强引用引用、软引用、虚引用

Java四种引用包括强引用,软引用引用,虚引用。...引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过引用的isEnQueued方法返回对象是否被垃圾回收器标记。...⑶引用(WeakReference) 引用与软引用的区别在于:只具有引用的对象拥有更短暂的生命周期。...引用可以和一个引用队列(ReferenceQueue)联合使用,如果引用引用的对象被垃圾回收,Java虚拟机就会把这个引用加入到与之关联的引用队列中。...= null) { // 清除ref } 总结 Java4种引用的级别由高到低依次为: 强引用 > 软引用 > 引用 > 虚引用 通过图来看一下他们之间在垃圾回收时的区别

1.5K10

【小家java引用类型(强引用、软引用引用、虚引用

1、概述 本文不论述java中值传递和引用传递之间的问题(有需求的可移步理解java中值传递和引用传递),而重点讨论Java中提供了4个级别的引用:强应用、软引用引用和虚引用。...这四个引用定义在java.lang.ref的包下。...方法 } } 从上可以看出,咱们就可以监听回收,然后doSomething了 引用(WeakReference):引用和软引用很像,当gc时,无论内存是否充足,都会回收被引用关联的对象。...如果引用引用的对象被JVM回收,这个引用就会被加入到与之关联的引用队列中 虚引用(关注使用场景) 虚引用(PhantomReference):虚引用和前面的软引用引用不同,它并不影响对象的生命周期...鉴于软引用引用)的特点,可以结合ReferenceQueue来实现高速缓存了,这样对内存也特别友好。

2K40

Java引用、软引用、虚引用、强引用、 Finalizer引用

Java层面,一共有四种引用:强引用、软引用引用、虚引用,这几种引用的生命周期由强到。转换关系大致如下图所示: ?...对于一个普通的对象,如果没有其他的引用关系,只要超过了引用作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了。...可以用来构建一种没有特定约束的关系,同样是缓存实现的选择(WeekHashMap就是采用引用的方式实现的)。JVM一旦发现了某个对象只有引用与之关联,不管当前内存空间足够与否,都会回收它的内存。...引用何时被加到ReferenceQueue队列里   在构造软引用引用和幻象引用的时候,可以传入一个ReferenceQueue的对象,这个队列是用来做什么的呢?...当软引用引用和幻象引用引用的对象被回收之后,对应的SoftReference,WeakReference,PhantomReference 对象已经不再具有存在的价值,需要一个适当的清除机制,避免大量

2K30

Java finalize函数与软引用引用、虚引用

一、finalize函数的作用        它不是C/C++中的析构函数,而是Java刚诞生时为了使C/C++程序员更容易接受它所做出的一个妥协”。...引用引用也是用来描述非必需对象的,但它的强度比软引用更弱,被引用关联的对象只能生存到下一次垃圾收集发生之前。...这里还需要强调的是,对于软引用引用,当执行第一次垃圾回收时,就会将软引用引用对象添加到其关联的引用队列中,然后其finalize函数才会被执行(如果没覆写则不会被执行);而对于虚引用,如果被引用对象没有覆写...,引用对象被添加进了引用队列;相反,对于虚引用,第一次gc之后,从虚引用队列中获取的对象为null,直到第二次gc才从虚引用队列中获取到了虚引用对象。.../p/e5364c05cc80  通过例子理解java引用,软引用,引用,虚引用 4、https://blog.csdn.net/a4171175/article/details/90749839

72920

Java引用:强、软、、虚

Java引用分为强引用、软引用引用、虚引用 一、强引用 public class M { @Override protected void finalize() throws Throwable...byte[]> m=new java.lang.ref.SoftReference(new byte[1024*1024*10]);//m和sr是强引用关系,但sr和byte[]是引用关系...可对该引用队列进行监控,如果有引用进来了,说明有对象被回收了 类似钩子函数,起到通知的作用 收到通知,可以做一些事。...对于软引用引用,当执行第一次垃圾回收时,就会将软引用引用对象添加到其关联的引用队列中,然后其finalize函数才会被执行(如果没覆写则不会被执行);而对于虚引用,如果被引用对象没有覆写finalize...引用:强、软、、虚', description : 'Java引用分为强引用、软引用引用、虚引用 一、强引用 public class M { @Ov…', wechatQrcodeTitle

24740

java引用、软引用引用、虚引用以及FinalReference

基于JDK1.8 rt.jar是java中的基础类库,在它的 java.lang.ref包下,有着一堆关于引用的类。软引用引用以及虚引用的定义就在其中。另外还有一个FinalReference。...* ReferenceQueue//引用队列 * Reference(abstract)//抽象类 * SoftReference//软引用 * WeakReference//引用...引用(WeakReference) 引用同样经常被用做缓存的实现,在JDK中比较常见的是维护一种非强制性的映射关系的实现,动态代理的缓存就是基于它实现的。...它的特点是:在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有引用的对象,不管当前内存空间足够与否,都会回收它的内存。可见它相对于软引用来说,拥有更为短暂的生命周期。...,PhantomReference只有这一个构造函数 一个对象,通过被“引用对象”引用,而改变了它的生命周期。

1.2K10

理解Java中的强引用,软引用引用,虚引用

Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用引用了...从Java SE2开始,就提供了四种类型的引用:强引用、软引用引用和虚引用。...在java中,用java.lang.ref.WeakReference类来表示。 引用与软引用的区别在于:只具有引用的对象拥有更短暂的生命周期。...引用还可以和一个引用队列(ReferenceQueue)联合使用,如果引用引用的对象被垃圾回收,Java虚拟机就会把这个引用加入到与之关联的引用队列中。...虚引用引用和前面的软引用引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。

1.7K20

【Android 内存优化】Java 引用类型 ( 强引用 | 软引用 | 引用 | 虚引用 )

文章目录 一、 Java 引用类型 ( 强、软、、虚 ) 二、 软引用代码示例 三、 引用代码示例 强引用 ( 不回收 ) > 软引用 ( OOM 前回收 ) > 引用 ( GC 必回收 ) >..., 持有短生命周期对象的引用 , 并且是强引用持有 , GC 无法释放该短生命周期对象引用 , 造成 OOM ; 一、 Java 引用类型 ( 强、软、、虚 ) ---- 1...., 直接回收 , 即使内存足够 , 也要回收该对象所占用的内存 ; ④ 虚引用 : 虚引用无法获得被引用的对象 , 其唯一的作用是对象被回收时 , 可以得到相应的通知 ; 虚引用不会对对象的生存周期造成影响任何...软引用代码示例 : import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; public class Main...软引用代码示例 : import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; public class Main

5.2K10

JAVA】强引用、软引用引用、幻象引用有什么区别?

前言 在 Java 语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,理解引用对于掌握 Java 对象生命周期和 JVM 内部相关机制非常有帮助。...对于一个普通的对象,如果没有其他的引用关系,只要超过了引用作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了,当然具体回收时机还是要看垃圾收集策略。...引用(WeakReference)并不能使对象豁免垃圾收集,仅仅是提供一种访问在引用状态下对象的途径。...可达(Weakly Reachable),类似前面提到的,就是无法通过强引用或者软引用访问,只能通过引用访问时的状态。...后记 以上就是 【JAVA】# 强引用、软引用引用、幻象引用有什么区别?

14630

Java引用、软引用引用及虚引用深入探讨

引用、软引用引用和虚引用深入探讨 为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为强引用、软引用引用、虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器对待它们会使用不同的处理方式...引用类型在日常开发中并不常关注,也很少注意到,因此很多人忽略了它们的存在,而事实上,引用类型在Java体系中扮演着十分重要的角色,要想对Java体系有一个更深层次的理解,了解和掌握这些引用的用法是十分必要的...从JDK 1.2版本开始,Java引用的概念进行了扩充,对象的引用分成了4种级别,从而使程序开发者能更加灵活地控制对象的生命周期,更好的控制创建的对象何时被释放和回收。...这4种级别由高到低依次为:强引用、软引用引用和虚引用。 实力翻车 欢迎来到大型翻车现场,接下来将实力演示一波因为强引用过多导致的翻车例子。...内容编排 接下来的文章将从以下几方面对这四种引用进行介绍: 简要介绍 强引用引用 引用引用 源码剖析 Reference源码详解 ReferenceQueue源码详解 SoftReference

41520

译文:理解Java中的引用

不久之前,我面试了一些求职Java高级开发工程师的应聘者。我常常会面试他们说,“你能给我介绍一些Java中得引用吗?”,如果面试者这样说,“嗯,是不是垃圾回收有关的?”...我开始困惑,为什么这块的知识如此不被重视,毕竟引用是一个很有用途的特性,况且这个特性已经在7年前 Java 1.2发布时便引入了。...接下来,你就可以在固定的周期,处理传入的引用队列,比如做一些清理工作来处理这些没有用的引用对象。 四种引用 Java中实际上有四种强度不同的引用,从强到它们分别是,强引用,软引用引用和虚引用。...它的唯一作用就是当其指向的对象被回收之后,自己被加入到引用队列,用作记录该引用指向的对象已被销毁。 当引用的指向对象变得引用可到达,该引用就会加入到引用队列。...它允许你知道具体何时其引用的对象从内存中移除。而实际上这是Java中唯一的方式。这一点尤其表现在处理类似图片的大文件的情况。

72720

Java中四种引用类型:强引用,软引用引用,虚引用

四种引用类型 强引用(StrongReference) 软引用(SoftReference) 引用(WeakReference) 虚引用 (PhantomReference) 强引用 类似Object...; import java.util.ArrayList; import java.util.List; /** * 演示强引用 * -Xmx20M */ public class StrongReference...执行结果会异常Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 软引用Java中用java.lang.ref.SoftReference...才会回收该对象 引用 引用也是用来描述非必需对象的,用java.lang.ref.WeakReference类来表示,当JVM进行垃圾回收时,无论内存是否充足,都会回收被引用关联的对象。...如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。 虚引用与软引用引用的区别:虚引用必须和引用队列联合使用。

85230

引用引用的区别_强引用引用引用引用的区别

示例代码: import java.lang.ref.SoftReference; /** * @author chenjc * @since 2020-01-13 */ public class SoftReferenceTest...第二次由于分配了较大的内存,导致GC,这时候由于内存资源紧张,软引用被回收了,也就是虽然User对象有一个软引用引用着它,但User对象在此条件下也会被GC回收。...所以软引用的对象在一定条件下可被回收,故软引用对象不会导致内存溢出。...软引用到底有没有被回收,可以通过给软引用一个ReferenceQueue来跟踪,将上面的代码片段稍作修改,如下: import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue...; import java.lang.ref.SoftReference; /** * @author chenjc * @since 2020-01-13 */ public class SoftReferenceTest

1.2K10
领券