首页
学习
活动
专区
工具
TVP
发布

Java引用、软引用、弱引用、虚引用

说明GC会引发软引用里对象内存回收,即使这个软引用本身还被强引用(list调用)着。 ? 最终回收了这些内存也不能避免OOM结局: ?...因为软引用通常情况下就是这样,只有内存马上要溢出了才触发它GC。就好像扁鹊见蔡桓公时候,蔡桓公病已经很深了,马上就没救了。所以有了下面弱引用方法:有病早治。...下一次GC,这中间产生引用对象也都被回收了。 ? 最终,由于GC及时,整个过程没有爆发OOM,平安结束了。 ? 虚引用引用也叫幻影引用。任何时候可能被GC回收,就像没有引用一样。...并且他必须和引用队列一起使用,用于跟踪垃圾回收过程,当垃圾回收器回收一个持有虚引用对象时,在回收对象后,将这个虚引用对象加入到引用队列中,用来通知应用程序垃圾回收情况。...总结 Java强软弱虚引用被回收时机不同:强引用引用被释放才会回收;软引用是没释放,但是快OOM了就会被回收;弱引用引用没释放,但是发生了GC后就会被回收;虚引用随时会回收,好像没有存在过,但是会有一个队列来跟踪它垃圾回收情况

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

引用、软引用、弱引用、虚引用对比

(弱引用),它们分别代表了系统对对象三种引用方式:软引用,虚引用以及弱引用。...因此java语言对对象引用有如下四种: 强引用:就是正常引用。...软引用:SoftReference,GC会在内存不足时候清理引用对象。...2 软引用和弱引用区别 弱引用不会影响GC清理,也就是说当GC检测到一个对象存在弱引用也会直接标记为可清理对象,而软引用只有在内存告罄时候才会被清理 3 弱引用和虚引用区别 说两者区别之前要说一下...虚引用必须和一个ReferenceQueue联合使用,当GC准备回收一个对象时候,如果发现该对象还有一个虚引用,就会将这个虚引用加入到与之关联队列 弱引用是当GC第一次试图回收该引用指向对象时会执行该对象

2K20

Java 引用、弱引用、软引用、虚引用

从JDK 1.2版本开始,把对象引用分为4种级别,从而使程序能更加灵活地控制对象生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。...⑶弱引用(WeakReference) 弱引用与软引用区别在于:只具有弱引用对象拥有更短暂生命周期。...弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用引用对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联引用队列中。...如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用对象内存被回收之前采取必要行动。 使用软引用构建敏感数据缓存 1 为什么需要使用软引用 首先,我们看一个雇员信息查询系统实例。...2 如果使用软引用 SoftReference特点是它一个实例保存对一个Java对象引用,该软引用存在不妨碍垃圾收集线程对该Java对象回收。

1.4K10

Java 引用、弱引用、软引用、虚引用

引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用引用对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联引用队列中。...3、弱引用(WeakReference)       弱引用与软引用区别在于:只具有弱引用对象拥有更短暂生命周期。...当你想引用一个对象,但是这个对象有自己生命周期,你不想介入这个对象生命周期,这时候你就是用弱引用。    ...当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象内存之前,把这个虚引用加入到与之 关联引用队列中。...5、总结     Java4种引用级别由高到低依次为: 强引用  >  软引用  >  弱引用  >  虚引用     通过图来看一下他们之间在垃圾回收时区别: ?

3.5K30

Java有关强引用,软引用,弱引用,虚引用记录

首先不要被一些对一些名词望而生畏,其实都是一些存在即合理东西。 引用本身很好理解,引用类型对象中存放是实际对象内存地址,垃圾回收时,就看对象是否存在引用。...1.强引用 正常创建对象,赋值变量都属于强引用类型,强引用类型在垃圾回收时,不会被回收,内存不足时直接抛出OutOfMemoryError错误。...在Java中使用SoftReference声明一个软引用,使用get方法返回对象引用,当软引用关联对象被回收时,get返回null。...但注意软引用本身是一个强引用,同样需要清除,可以通过注册ReferenceQueue监听关联对象已被回收引用本身,进行清除操作。...4.虚引用(PhantomReference) 虚引用和没有引用一样,虚引用在使用上必须结合前面提到ReferenceQueue,可以通过引用队列来监听是否关联对象将要被回收,可以在此时机进行处理操作

1.2K30

理解Java中引用,软引用,弱引用,虚引用

从Java SE2开始,就提供了四种类型引用:强引用、软引用、弱引用和虚引用。...强引用 之前我们使用大部分引用实际上都是强引用,这是使用最普遍引用。...软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用引用对象被JVM回收,这个软引用就会被加入到与之关联引用队列中。...弱引用与软引用区别在于:只具有弱引用对象拥有更短暂生命周期。在垃圾回收器线程扫描它所管辖内存区域过程中,一旦发现了只具有弱引用对象,不管当前内存空间足够与否,都会回收它内存。...程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用对象内存被回收之前采取必要行动。

1.7K20

聊聊Java引用类型(强引用、软引用、弱引用、虚引用),示例WeakHashMap使用【享学Java】

引用类型数据变量值会存放在堆中,变量名(引用地址)会存放在栈中。 值类型数据具有较快存取速度 Java引用类型 在Java中提供了四个级别的引用:强引用,软引用,弱引用和虚引用。...(JVM宁愿抛出OOM异常也不回收强引用所指向对)被引用对象。...若你内存够大,无需考虑极致性能,所有引用都使用强引用也是ok~ 强引用可直接访问,是Java默认引用方式~ ---- ---- 注意:我看到很多文章把FinalReference解释为强引用...SoftReference特点是它一个实例保存对一个Java对象引用,该软引用存在不妨碍垃圾收集线程对该Java对象回收。...如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用对象内存被回收之前采取必要行动(比如释放资源等等操作)。

1.2K30

Java引用,软引用,弱引用,虚引用及其使用场景

从 JDK1.2 版本开始,Java 把对象引用分为四种级别,从而使程序能更加灵活控制对象生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。...例如:一个类发送网络请求,承担 callback 静态内部类,则常以虚引用方式来保存外部类引用,当外部类需要被 JVM 回收时,不会因为网络请求没有及时回应,引起内存泄漏。...虚引用与软引用和弱引用一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。...当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象内存之前,把这个虚引用加入到与之关联引用队列中。...一般可以通过虚引用达到回收一些非java内一些资源比如堆外内存行为。

4.3K20

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

引用 Java中引用,有点像C++指针,通过引用,可以对堆中对象进行操作。...软引用引用是除强引用外,最强引用类型。...此外,没有任何约束保证软引用将在某个特定时间点被清除,或者确定一组不同引用对象被清除顺序。不过,虚拟机具体实现会倾向于不清除最近创建或最近使用过引用。...说明,在系统内存紧张情况下,软引用被回收并且加入注册引用队列 软引用在我们日常开发中使用场景很多,比如商城中商品信息。某个商品可能会被多人访问,此时我们可以把该商品信息使用软引用保存。...一旦一个弱引用对象被垃圾收集器回收,便会加入导一个注册引用队列中 虚引用引用时所有引用类型中最弱一个,一个持有弱引用对象,和没有引用几乎是一样,随时都可能被垃圾回收器回收。

2.1K31

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

1、概述 本文不论述java中值传递和引用传递之间问题(有需求可移步理解java中值传递和引用传递),而重点讨论Java中提供了4个级别的引用:强应用、软引用、弱引用和虚引用。...(JVM宁愿抛出OOM异常也不回收强引用所指向对)被引用对象。...软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用引用对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联引用队列中。...如果弱引用引用对象被JVM回收,这个弱引用就会被加入到与之关联引用队列中 虚引用(关注使用场景) 虚引用(PhantomReference):虚引用和前面的软引用、弱引用不同,它并不影响对象生命周期...,那么相应值对象引用会从Map中删除。

2K40

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

在Java层面,一共有四种引用:强引用、软引用、弱引用、虚引用,这几种引用生命周期由强到弱。转换关系大致如下图所示: ?...对于一个普通对象,如果没有其他引用关系,只要超过了引用作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集了。...只有当JVM认为内存不足时,才会试图回收软引用指向对象,JVM会确保在抛出OutOfMemoryError之前,清理软引用指向对象。...引用何时被加到ReferenceQueue队列里   在构造软引用,弱引用和幻象引用时候,可以传入一个ReferenceQueue对象,这个队列是用来做什么呢?...当软引用,弱引用和幻象引用引用对象被回收之后,对应SoftReference,WeakReference,PhantomReference 对象已经不再具有存在价值,需要一个适当清除机制,避免大量

2K30

一文带你读懂Java引用、软引用、弱引用、虚引用

图1 java 虚拟机运行时数据区 本文即将介绍到:Java引用、软引用、弱引用、虚引用,都与JVMGC有着莫大关系。...在SDK1.2之前,Java对引用定义很传统:如果reference类型数据存储数值代表是另外一块内存起始地址,就称为“这块内存代表着一个引用”。...强引用(Strong Reference) 在程序代码中普遍存在,类似下面这类引用,只要强引用存在,那么GC Collector就永远不会回收掉被引用对象。...弱引用(Weak Reference) 描述非必需对象,但他强度比软引用更弱一些,被弱引用关联对象只能生存到下一次GC发生之前。当GC发生时,无论内存是否足够,都会回收掉只被弱引用关联对象。...(Phantom Reference) 幽灵引用或幻影引用,是最弱一种引用关系。

40030

深入理解Java四种引用类型强引用(StrongReference)软引用(SoftReference)弱引用(WeakReference)虚引用(PhantomReference)多引用类型可达

这里还涉及到 java 中 4 种引用方式: 强引用, 软引用, 弱引用和虚引用, 其引用强度越来越来低, 意味着引用越弱对象越容易被垃圾回收。...软引用可以和一个引用队列(ReferenceQueue) 联合使用, 如果软引用引用对象被垃圾回收器回收, Java 虚拟机就会把这个软引用加入到与之关联引用队列中。...可以通过软引用来解决 弱引用(WeakReference) 引用与软引用区别在于: 只具有弱引用对象拥有更短暂生命周期。...多引用类型可达性判断 比较容易理解是 Java 垃圾回收器会优先清理可达强度低对象。 那现在问题来了, 若一个对象引用类型有多个, 那到底如何判断它可 达性呢?...其实规则如下: (“单弱多强” ) 单条引用可达性以最弱一个引用类型来决定; 多条引用可达性以最强一个引用类型来决定; ?

74410

什么是强引用、软引用、弱引用、虚引用

什么是强引用、软引用、弱引用、虚引用? 强引用(StrongReference):一般指的是对像被new出来,强引用一般不会被jvm收回,但会报OutOfMemory(内存不足)。...Object obj = new Object(); 软引用(SoftReference):软引用相对来说弱于强引用,当内存足够时候不会被GC回收,但内存不足时,再试图回收软引用,通过软引用可以做临时缓存...(PhantomReference):这个引用也有人叫幻引用,也很明显,引用一个不存在,随时会被干掉,算是所有引用中最容易被干掉。...oj, req); // 每次返回Null System.out.println(pr.get()); //返回是否被删除 System.out.println(pr.isEnqueued()); 各种引用是怎么被回收...引用类型 GC策略 简介 强引用(StrongReference) 永远不会回收(GC ROOT可引用前提下) 最基本引用Object obj=new Object() 软引用(SoftReference

1.6K10

JAVA面试50讲之3:强引用、软引用、弱引用、虚引用区别?

一.强引用、软引用、弱引用、虚引用概念   在Java中,虽然不需要程序员手动去管理对象生命周期,但是如果希望某些对象具备一定生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory...错误)就需要用到软引用和弱引用了。   ...不过要注意是,这里所说被弱引用关联对象是指只有弱引用与之关联,如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象(软引用也是如此)。   ...程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用对象内存被回收之前采取必要行动。...而对于其他三种类型引用,使用得最多就是软引用和弱引用,这2种既有相似之处又有区别。

1.8K21
领券