-
java 强引用_JAVA 中的强引用与弱引用详解
2021-02-12 10:01:53强引用(Strong Reference)强引用就是我们经常使用的引用,其写法如下StringBuffer buffer = new StringBuffer();上面创建了一个StringBuffer对象,并将这个对象的(强)引用存到变量buffer中。是的,就是这个小儿科的...强引用(Strong Reference)
强引用就是我们经常使用的引用,其写法如下StringBuffer buffer = new StringBuffer();
上面创建了一个StringBuffer对象,并将这个对象的(强)引用存到变量buffer中。是的,就是这个小儿科的操作(请原谅我这样的说 法)。强引用最重要的就是它能够让引用变得强(Strong),这就决定了它和垃圾回收器的交互。具体来说,如果一个对象通过一串强引用链接可到达 (Strongly reachable),它是不会被回收的。如果你不想让你正在使用的对象被回收,这就正是你所需要的。
但是强引用如此之强
在一个程序里,将一个类设置成不可被扩展是有点不太常见的,当然这个完全可以通过类标记成final实现。或者也可以更加复杂一些,就是通过内部包 含了未知数量具体实现的工厂方法返回一个接口(Interface)。举个例子,我们想要使用一个叫做Widget的类,但是这个类不能被继承,所以无法 增加新的功能。
但是我们如果想追踪Widget对象的额外信息,我们该怎么办? 假设我们需要记录每个对象的序列号,但是由于Widget类并不包含这个属性,而且也不能扩展导致我们也不能增加这个属性。其实一点问题也没有,HashMap完全可以解决上述的问题。serialNumberMap.put(widget, widgetSerialNumber);
这表面看上去没有问题,但是widget对象的强引用很有可能会引发问题。我们可以确信当一个widget序列号不需要时,我们应该将这个条目从 map中移除。如果我们没有移除的话,可能会导致内存泄露,亦或者我们手动移除时删除了我们正在使用的widgets,会导致有效数据的丢失。其实这些问 题很类似,这就是没有垃圾回收机制的语言管理内存时常遇到的问题。但是我们不用去担心这个问题,因为我们使用的时具有垃圾回收机制的Java语言。
另一个强引用可能带来的问题就是缓存,尤其是像图片这样的大文件的缓存。假设你有一个程序需要处理用户提供的图片,通常的做法就是做图片数据缓存,因为从磁盘加载图片代价很大,并且同时我们也想避免在内存中同时存在两份一样的图片数据。
缓存被设计的目的就是避免我们去再次加载哪些不需要的文件。你会很快发现在缓存中会一直包含一个到已经指向内存中图片数据的引用。使用强引用会强制 图片数据留在内存,这就需要你来决定什么时候图片数据不需要并且手动从缓存中移除,进而可以让垃圾回收器回收。因此你再一次被强制做垃圾回收器该做的工 作,并且人为决定是该清理到哪一个对象。
在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JVM 也不会回收。因此强引用是造成Java 内存泄漏的主要原因之一。
弱引用
弱引用需要用WeakReference 类来实现,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管 JVM 的内存空间是否足够,总会回收该对象占用的内存。
弱引用简单来说就是将对象留在内存的能力不是那么强的引用。使用WeakReference,垃圾回收器会帮你来决定引用的对象何时回收并且将对象从内存移除。创建弱引用如下
WeakReference weakWidget = new WeakReference(widget);
使用weakWidget.get()就可以得到真实的Widget对象,因为弱引用不能阻挡垃圾回收器对其回收,你会发现(当没有任何强引用到widget对象时)使用get时突然返回null。
解决上述的widget序列数记录的问题,最简单的办法就是使用Java内置的WeakHashMap类。WeakHashMap和HashMap 几乎一样,唯一的区别就是它的键(不是值!!!)使用WeakReference引用。当WeakHashMap的键标记为垃圾的时候,这个键对应的条目 就会自动被移除。这就避免了上面不需要的Widget对象手动删除的问题。使用WeakHashMap可以很便捷地转为HashMap或者Map。
虚引用需要PhantomReference 类来实现,它不能单独使用,必须和引用队列联合使用。虚引用的主要作用是跟踪对象被垃圾回收的状态。
-
java强引用_JAVA 中的强引用与弱引用详解
2021-02-12 10:43:42强引用(Strong Reference)强引用就是我们经常使用的引用,其写法如下StringBuffer buffer = new StringBuffer();上面创建了一个StringBuffer对象,并将这个对象的(强)引用存到变量buffer中。是的,就是这个小儿科的...强引用(Strong Reference)
强引用就是我们经常使用的引用,其写法如下StringBuffer buffer = new StringBuffer();
上面创建了一个StringBuffer对象,并将这个对象的(强)引用存到变量buffer中。是的,就是这个小儿科的操作(请原谅我这样的说 法)。强引用最重要的就是它能够让引用变得强(Strong),这就决定了它和垃圾回收器的交互。具体来说,如果一个对象通过一串强引用链接可到达 (Strongly reachable),它是不会被回收的。如果你不想让你正在使用的对象被回收,这就正是你所需要的。
但是强引用如此之强
在一个程序里,将一个类设置成不可被扩展是有点不太常见的,当然这个完全可以通过类标记成final实现。或者也可以更加复杂一些,就是通过内部包 含了未知数量具体实现的工厂方法返回一个接口(Interface)。举个例子,我们想要使用一个叫做Widget的类,但是这个类不能被继承,所以无法 增加新的功能。
但是我们如果想追踪Widget对象的额外信息,我们该怎么办? 假设我们需要记录每个对象的序列号,但是由于Widget类并不包含这个属性,而且也不能扩展导致我们也不能增加这个属性。其实一点问题也没有,HashMap完全可以解决上述的问题。serialNumberMap.put(widget, widgetSerialNumber);
这表面看上去没有问题,但是widget对象的强引用很有可能会引发问题。我们可以确信当一个widget序列号不需要时,我们应该将这个条目从 map中移除。如果我们没有移除的话,可能会导致内存泄露,亦或者我们手动移除时删除了我们正在使用的widgets,会导致有效数据的丢失。其实这些问 题很类似,这就是没有垃圾回收机制的语言管理内存时常遇到的问题。但是我们不用去担心这个问题,因为我们使用的时具有垃圾回收机制的Java语言。
另一个强引用可能带来的问题就是缓存,尤其是像图片这样的大文件的缓存。假设你有一个程序需要处理用户提供的图片,通常的做法就是做图片数据缓存,因为从磁盘加载图片代价很大,并且同时我们也想避免在内存中同时存在两份一样的图片数据。
缓存被设计的目的就是避免我们去再次加载哪些不需要的文件。你会很快发现在缓存中会一直包含一个到已经指向内存中图片数据的引用。使用强引用会强制 图片数据留在内存,这就需要你来决定什么时候图片数据不需要并且手动从缓存中移除,进而可以让垃圾回收器回收。因此你再一次被强制做垃圾回收器该做的工 作,并且人为决定是该清理到哪一个对象。
在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JVM 也不会回收。因此强引用是造成Java 内存泄漏的主要原因之一。
弱引用
弱引用需要用WeakReference 类来实现,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管 JVM 的内存空间是否足够,总会回收该对象占用的内存。
弱引用简单来说就是将对象留在内存的能力不是那么强的引用。使用WeakReference,垃圾回收器会帮你来决定引用的对象何时回收并且将对象从内存移除。创建弱引用如下
WeakReference weakWidget = new WeakReference(widget);
使用weakWidget.get()就可以得到真实的Widget对象,因为弱引用不能阻挡垃圾回收器对其回收,你会发现(当没有任何强引用到widget对象时)使用get时突然返回null。
解决上述的widget序列数记录的问题,最简单的办法就是使用Java内置的WeakHashMap类。WeakHashMap和HashMap 几乎一样,唯一的区别就是它的键(不是值!!!)使用WeakReference引用。当WeakHashMap的键标记为垃圾的时候,这个键对应的条目 就会自动被移除。这就避免了上面不需要的Widget对象手动删除的问题。使用WeakHashMap可以很便捷地转为HashMap或者Map。
虚引用需要PhantomReference 类来实现,它不能单独使用,必须和引用队列联合使用。虚引用的主要作用是跟踪对象被垃圾回收的状态。
-
java中弱引用和强信用_java中的强引用与弱引用的区别与用处
2021-03-18 10:02:20java中的强引用与弱引用的区别与用处发布时间:2020-04-11 10:44:22来源:亿速云阅读:104作者:小新今天小编给大家分享的是java中的强引用与弱引用的区别与用处,很多人都不太了解,今天小编为了让大家更加了解java...java中的强引用与弱引用的区别与用处
发布时间:2020-04-11 10:44:22
来源:亿速云
阅读:104
作者:小新
今天小编给大家分享的是java中的强引用与弱引用的区别与用处,很多人都不太了解,今天小编为了让大家更加了解java中的强引用与弱引用,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。
一、强引用
我们平时new了一个对象就是强引用,例如Object obj = new Object();
即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。
(推荐视频教程:java视频教程)
二、软引用
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。SoftReference softRef=new SoftReference(str); // 软引用
用处:
软引用在实际中有重要的应用,例如浏览器的后退按钮。按后退时,这个后退时显示的网页内容是重新进行请求还是从缓存中取出呢?这就要看具体的实现策略了。
(1)如果一个网页在浏览结束时就进行内容的回收,则按后退查看前面浏览过的页面时,需要重新构建。
(2)如果将浏览过的网页存储到内存中会造成内存的大量浪费,甚至会造成内存溢出。
如下代码:Browser prev = new Browser(); // 获取页面进行浏览
SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用
if(sr.get()!=null){
rev = (Browser) sr.get(); // 还没有被回收器回收,直接获取
}else{
prev = new Browser(); // 由于内存吃紧,所以对软引用的对象回收了
sr = new SoftReference(prev); // 重新构建
}
以上就是java中的强引用与弱引用的区别与用处的简略介绍,当然详细使用上面的不同还得要大家自己使用过才领会。如果想了解更多,欢迎关注亿速云行业资讯频道哦!
-
java中弱引用和强信用_Java 强引用 软引用与弱引用,虚引用区别
2021-03-18 10:02:18强引用(StrongReference):如果一个对象具有强引用,那垃圾回收器绝不会回收它,当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题...强引用(StrongReference):
如果一个对象具有强引用,那垃圾回收器绝不会回收它,当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题;
Object o=new Object(); // 强引用
软引用(SoftReference):
软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。下面是一个使用示例:
SoftReference sr = new SoftReference(new String("hello"));
System.out.println(sr.get());
弱引用(WeakReference)
弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。下面是使用示例:
WeakReference sr = new WeakReference(new String("hello"));
System.out.println(sr.get());
4.虚引用(PhantomReference)
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
引用队列(Reference Queue):
一旦弱引用对象开始返回null,该弱引用指向的对象就被标记成了垃圾。而这个弱引用对象(非其指向的对象)就没有什么用了。通常这时候需要进行一些清理工作。比如WeakHashMap会在这时候移除没用的条目来避免保存无限制增长的没有意义的弱引用。
引用队列可以很容易地实现跟踪不需要的引用。当你在构造WeakReference时传入一个ReferenceQueue对象,当该引用指向的对象被标记为垃圾的时候,这个引用对象会自动地加入到引用队列里面。接下来,你就可以在固定的周期,处理传入的引用队列,比如做一些清理工作来处理这些没有用的引用对象。
-
Java 强引用与软引用以及弱引用,虚引用
2019-09-27 09:15:301.对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。...这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。图 1为对象应用类层次。 ... -
Java强引用,软引用,弱引用与虚引用
2020-05-28 17:25:50目录1 概述2 强引用(StrongReference)3 软引用(SoftReference)4 弱引用(WeakReference)5 虚引用 参考资料 深入理解 1 概述 引用类型 被回收时间 用途 生存时间 强引用 从来不会 对象的一般状态 JVM停止运行... -
java 强引用,弱引用,软引用
2015-04-14 14:46:51JAVA学习之4 引用与JVM 1.java内存管理分为内存分配和内存回收,都不需要程序员负责。 2.垃圾回收的机制主要是看对象是否有引用指向该对象。 java对象的引用包括 强引用 软引用 弱引用 虚... -
java中的强引用与弱引用
2018-04-24 19:59:20一、强引用 String str="this is strong reference"; ...以上是一个强引用的简单例子:str被“this is strong reference”...java中典型的弱引用便是ThreadLocal对象:ThreadLocal继承了WeakRef... -
Java 强引用、弱引用、软引用和虚引用和JVM
2014-05-10 10:38:33JAVA学习之4 引用与JVM 1.java内存管理分为内存分配和内存回收,都不需要程序员负责。 2.垃圾回收的机制主要是看对象是否有引用指向该对象。 java对象的引用包括 强引用 软引用 弱引用 虚引用 ... -
JAVA之强引用,弱引用,软引用 与 JVM
2016-09-13 10:34:47弱引用 虚引用 3.强引用 是指创建一个对象并把这个对象赋给一个引用变量。 强引用有引用变量指向时永远不会被垃圾回收。即使内存不足的时候。 4.软引用 软引用通过SoftReferenc -
Java学习之强引用,弱引用,软引用 与 JVM
2019-10-07 13:25:13java对象的引用包括 强引用 软引用 弱引用 虚引用 3、强引用 是指创建一个对象并把这个对象赋给一个引用变量。 强引用有引用变量指向时永远不会被垃圾回收。即使内存不足的时候。4、软引用 软引用通过... -
java 软引用、弱引用、强引用、虚引用的解析
2016-03-25 11:37:57软引用与强引用、弱引用、虚引用的对比 软引用的应用 软引用与强引用、弱引用、虚引用的对比 强引用 弱引用 虚引用 软引用 强引用强引用也就是我们一般使用的引用,如若一个对象有强引用,那么即使内存不足的情况... -
java强引用-软引用-弱引用-虚引用
2019-12-24 18:22:58强引用:普通的引用,强引用指向的对象不会被回收; 软引用:仅有软引用指向的对象,只有发生gc且内存不足,才会被回收; 弱引用:仅有弱引用指向的对象,只要发生gc就会被回收。 虚引用:在任何时候都可能被垃圾... -
Java 强引用,软引用,弱引用,虚引用
2018-06-16 09:27:03软引用:软引用是引用强度仅弱与抢引用的一种引用。它使用类SoftReference来表示。当java虚拟机内存不足时,GC会回收哪些只被软引用指向的对象。从而避免内存溢出。在GC释放了哪些只被软引用指向... -
JAVA软引用与弱引用及其应用举例
2020-04-28 17:25:011. 定义强引用、软引用和弱引用的方式 new出来的是强引用,比如String str = new String(“123” ); 弱引用: WeakReference<String> weakRef=new WeakReference<String>(str); 其中str是引用 软... -
java 对象引用 弱引用吗_Java 对象引用方式 —— 强引用、软引用、弱引用和虚引用...
2021-03-09 16:01:042.软引用(SoftReference)如果一个对象只具有软引用,在内存空间足够的时候,GC不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要GC没有回收它,该对象就可以被程序使用。...3.弱引用(We... -
java中软引用与弱引用的笔记
2016-05-27 14:50:32但我们可以用软引用和弱引用来解决这类问题。简单介绍平常我们定义一个对象,并对对象使用。其实默认是对其使用了强引用Object o = new Object();平时这样使用其实问题不大,但举个例子: 当在Activity中创建Fragm -
Java强引用、 软引用、 弱引用、虚引用
2016-11-05 21:38:56知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用。我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型... -
JAVA学习之4 强引用,弱引用,软引用 与 JVM
2015-01-12 23:15:06JAVA学习之4 引用与JVM 1.java内存管理分为内存分配和内存回收,都不需要程序员负责。 2.垃圾回收的机制主要是看对象是否有引用指向该对象。 java对象的引用包括 强引用 软引用 弱引用 虚引用 ... -
Java强引用、软引用、弱引用、虚引用详解
2015-04-25 16:20:40强引用:如果一个对象具有强引用,GC绝不会回收它;...虚引用:如果一个对象仅持有虚引用,在任何时候都可能被垃圾回收,虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列联合使用,虚引用主要用来跟 -
Java 强引用、软引用、弱引用、虚引用
2018-11-23 13:56:29参考来源:http://www.cnblogs.com/dolphin0520/p/3784171.html...!! ... 1.强引用 示例:Object object=new Object();...只要某个对象与强引用相关联,JVM必定不会回收该对象,即使在内存不足的情况下,JVM宁愿跑出... -
Java 四种引用 强引用 软引用 弱引用 虚引用
2019-03-04 11:16:10一个对象具有请引用,或者有强引用与之关联。JVM在内存不足时会抛出异常,不会回收对象。取消强引用,可以显示的将强引用复制为null。 2软引用:在Java中用java.lang.ref.SoftReference类来表示。JVM在内存不足时... -
Java 关于强引用,软引用,弱引用和虚引用的区别与用法
2019-06-23 20:52:381.强引用 ...当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。 Arraylist中的clear方法 public void clear() { modC...