java弱引用什么时候回收 JAVA的软弱虚引用有什么用,主要在什么时候用
这篇文章给大家聊聊关于java弱引用什么时候回收,以及JAVA的软弱虚引用有什么用,主要在什么时候用对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
java中虚引用是怎么回事
虚引用可以用来做一些精细的内存控制操作。\x0d\x0a你声明虚引用的时候是要传入一个queue的。当你的虚引用所引用的对象已经执行完finalize函数的时候,就会把对象加到queue里面。你可以通过判断queue里面是不是有对象来判断你的对象是不是要被回收了【这是重点,让你知道你的对象什么时候会被回收。因为对普通的对象,gc要回收它的,你是知道它什么时候会被回收】。\x0d\x0a\x0d\x0a知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用。我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型。这正是Java中弱引用和软引用的主要区别。如果一个对象只有弱引用指向它,垃圾回收器会立即回收该对象,这是一种急切回收方式。相对的,如果有软引用指向这些对象,则只有在JVM需要内存时才回收这些对象。弱引用和软引用的特殊行为使得它们在某些情况下非常有用。例如:软引用可以很好的用来实现缓存,当JVM需要内存时,垃圾回收器就会回收这些只有被软引用指向的对象。而弱引用非常适合存储元数据,例如:存储ClassLoader引用。如果没有类被加载,那么也没有指向ClassLoader的引用。一旦上一次的强引用被去除,只有弱引用的ClassLoader就会被回收。这篇文章中我们将讲述不同类型的Java引用,例如:强引用(Strong Reference)和虚引用(PhantomReference)。\x0d\x0aJava中弱引用VS软引用\x0d\x0aJava中有如下四种类型的引用:\x0d\x0a1.强引用(Strong Reference)\x0d\x0a2.弱引用(WeakReference)\x0d\x0a3.软引用(SoftReference)\x0d\x0a4.虚引用(PhantomReference)\x0d\x0a强引用是我们在编程过程中使用的最简单的引用,如代码String s=”abc”中变量s就是字符串对象”abc”的一个强引用。任何被强引用指向的对象都不能被垃圾回收器回收,这些对象都是在程序中需要的。弱引用使用java.lang.ref.WeakReference class类来表示,你可以使用如下代码创建弱引用:\x0d\x0a代码如下:\x0d\x0a\x0d\x0aCounter counter= new Counter();// strong reference- line 1\x0d\x0aWeakReference weakCounter= new WeakReference(counter);//weak reference\x0d\x0acounter= null;// now Counter object is eligible for garbage collection\x0d\x0a现在只要你给强引用对象counter赋空值null,该对象就可以被垃圾回收器回收。因为该对象此时不再含有其他强引用,即使指向该对象的弱引用weakCounter也无法阻止垃圾回收器对该对象的回收。相反的,如果该对象含有软引用,Counter对象不会立即被回收,除非JVM需要内存。Java中的软引用使用java.lang.ref.SoftReference类来表示,你可以使用如下代码创建软引用:\x0d\x0a代码如下:\x0d\x0a\x0d\x0aCounter prime= new Counter();// prime holds a strong reference _ line 2\x0d\x0aSoftReference soft= new SoftReference(prime);//soft reference variable has SoftReference to Counter Object created at line 2\x0d\x0a\x0d\x0aprime= null;// now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory\x0d\x0a强引用置空之后,代码的第二行为对象Counter创建了一个软引用,该引用同样不能阻止垃圾回收器回收对象,但是可以延迟回收,与弱引用中急切回收对象不同。鉴于软引用和弱引用的这一区别,软引用更适用于缓存机制,而弱引用更适用于存贮元数据。另一个使用弱引用的例子是WeakHashMap,它是除HashMap和TreeMap之外,Map接口的另一种实现。WeakHashMap有一个特点:map中的键值(keys)都被封装成弱引用,也就是说一旦强引用被删除,WeakHashMap内部的弱引用就无法阻止该对象被垃圾回收器回收。\x0d\x0a虚引用是java.lang.ref package包中第三种可用的引用,使用java.lang.ref.PhantomReference类来表示。拥有虚引用的对象可以在任何时候被垃圾回收器回收。和弱引用和软引用相似,你可以通过如下代码创建虚引用:\x0d\x0a代码如下:\x0d\x0a\x0d\x0aDigitalCounter digit= new DigitalCounter();// digit reference variable has strong reference _ line 3\x0d\x0aPhantomReference phantom= new PhantomReference(digit);// phantom reference to object created at line 3\x0d\x0a\x0d\x0adigit= null;\x0d\x0a一旦移除强引用,第三行的DigitalCounter对象可以在任何时候被垃圾回收器回收。因为只有一个虚引用指向该对象,而虚引用无法阻止垃圾回收器回收对象。\x0d\x0a除了了解弱引用、软引用、虚引用和WeakHashMap,还需要了解ReferenceQueue。在创建任何弱引用、软引用和虚引用的过程中你可以通过如下代码提供引用队列ReferenceQueue:\x0d\x0a代码如下:\x0d\x0a\x0d\x0aReferenceQueue refQueue= new ReferenceQueue();//reference will be stored in this queue for cleanup\x0d\x0aDigitalCounter digit= new DigitalCounter();\x0d\x0aPhantomReference phantom= new PhantomReference(digit, refQueue);\x0d\x0a引用实例被添加在引用队列中,你可以再任何时候通过查询引用队列回收对象。一个对象的生命周期可以通过下图进行\x0d\x0a\x0d\x0a在新窗口打开图片\x0d\x0a\x0d\x0a这就是Java中弱引用和软引用的区别。我们还学到了一些基本的引用类:弱引用、软引用、虚引用以及WeakHashMap和WeakHashMap。总之,合理的使用引用可以帮助垃圾回收器更好的管理Java内存。
JAVA的软弱虚引用有什么用,主要在什么时候用
强引用,任何时候都不会被;垃圾回收器回收,如果内存不足,宁愿抛出OutOfMemoryError
软引用,只有在内存将满的时候才会被垃圾回收器回收,如果还有可用内存,垃圾回收器不会回收
弱引用,只要垃圾回收器运行,就肯定会被回收,不管还有没有可用内存。
虚引用,虚引用等于没有引用,任何时候都有可能被垃圾回收。
----------------
下面谈谈我的理解:
软引用非常适合用来实现高速缓存。
高速缓存的特点,如果命中则能加快响应,如果未命中还能去重新获取原始数据。
如对某更新频率低,但查询很慢的数据库。SQL查询高速缓存是个不错的注意。
importjava.lang.ref.SoftReference;
importjava.util.HashMap;
importjava.util.Map;
publicclassTest{
privatestaticMap<String,SoftReference>sqlCache=newHashMap<>();
privatestaticObjectgetFromChache(Stringsql){
SoftReferencesr=sqlCache.get(sql);
Objectobject=sr==null?null:sr.get();
if(object==null){
object=getFromQuery(sql);
sqlCache.put(sql,newSoftReference(object));
}
returnobject;
}
privatestaticObjectgetFromQuery(Stringsql){
//从数据库查询,速度较慢。
returnnull;
}
}
---------------
为什么不直接使用Map<String, Object>,因为这样的话就会是强引用,随着缓存的越来越多,内存会耗尽,而垃圾回收不会回收,因为数据还被强引用引用。
而是用软引用,会在内存将耗尽的情况下,将其进行垃圾回收(会优先回收最近不被使用的软引用对象)
java中虚引用是怎么回事啊
虚引用可以用来做一些精细的内存控制操作。
你声明虚引用的时候是要传入一个queue的。当你的虚引用所引用的对象已经执行完finalize函数的时候,就会把对象加到queue里面。你可以通过判断queue里面是不是有对象来判断你的对象是不是要被回收了【这是重点,让你知道你的对象什么时候会被回收。因为对普通的对象,gc要回收它的,你是知道它什么时候会被回收】。
知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用。我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型。这正是Java中弱引用和软引用的主要区别。如果一个对象只有弱引用指向它,垃圾回收器会立即回收该对象,这是一种急切回收方式。相对的,如果有软引用指向这些对象,则只有在JVM需要内存时才回收这些对象。弱引用和软引用的特殊行为使得它们在某些情况下非常有用。例如:软引用可以很好的用来实现缓存,当JVM需要内存时,垃圾回收器就会回收这些只有被软引用指向的对象。而弱引用非常适合存储元数据,例如:存储ClassLoader引用。如果没有类被加载,那么也没有指向ClassLoader的引用。一旦上一次的强引用被去除,只有弱引用的ClassLoader就会被回收。这篇文章中我们将讲述不同类型的Java引用,例如:强引用(Strong Reference)和虚引用(PhantomReference)。
Java中弱引用VS软引用
Java中有如下四种类型的引用:
1.强引用(Strong Reference)
2.弱引用(WeakReference)
3.软引用(SoftReference)
4.虚引用(PhantomReference)
强引用是我们在编程过程中使用的最简单的引用,如代码String s=”abc”中变量s就是字符串对象”abc”的一个强引用。任何被强引用指向的对象都不能被垃圾回收器回收,这些对象都是在程序中需要的。弱引用使用java.lang.ref.WeakReference class类来表示,你可以使用如下代码创建弱引用:
代码如下:
Counter counter= new Counter();// strong reference- line 1
WeakReference<Counter> weakCounter= new WeakReference<Counter>(counter);//weak reference
counter= null;// now Counter object is eligible for garbage collection
现在只要你给强引用对象counter赋空值null,该对象就可以被垃圾回收器回收。因为该对象此时不再含有其他强引用,即使指向该对象的弱引用weakCounter也无法阻止垃圾回收器对该对象的回收。相反的,如果该对象含有软引用,Counter对象不会立即被回收,除非JVM需要内存。Java中的软引用使用java.lang.ref.SoftReference类来表示,你可以使用如下代码创建软引用:
代码如下:
Counter prime= new Counter();// prime holds a strong reference– line 2
SoftReference soft= new SoftReference(prime);//soft reference variable has SoftReference to Counter Object created at line 2
prime= null;// now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
强引用置空之后,代码的第二行为对象Counter创建了一个软引用,该引用同样不能阻止垃圾回收器回收对象,但是可以延迟回收,与弱引用中急切回收对象不同。鉴于软引用和弱引用的这一区别,软引用更适用于缓存机制,而弱引用更适用于存贮元数据。另一个使用弱引用的例子是WeakHashMap,它是除HashMap和TreeMap之外,Map接口的另一种实现。WeakHashMap有一个特点:map中的键值(keys)都被封装成弱引用,也就是说一旦强引用被删除,WeakHashMap内部的弱引用就无法阻止该对象被垃圾回收器回收。
虚引用是java.lang.ref package包中第三种可用的引用,使用java.lang.ref.PhantomReference类来表示。拥有虚引用的对象可以在任何时候被垃圾回收器回收。和弱引用和软引用相似,你可以通过如下代码创建虚引用:
代码如下:
DigitalCounter digit= new DigitalCounter();// digit reference variable has strong reference– line 3
PhantomReference phantom= new PhantomReference(digit);// phantom reference to object created at line 3
digit= null;
一旦移除强引用,第三行的DigitalCounter对象可以在任何时候被垃圾回收器回收。因为只有一个虚引用指向该对象,而虚引用无法阻止垃圾回收器回收对象。
除了了解弱引用、软引用、虚引用和WeakHashMap,还需要了解ReferenceQueue。在创建任何弱引用、软引用和虚引用的过程中你可以通过如下代码提供引用队列ReferenceQueue:
代码如下:
ReferenceQueue refQueue= new ReferenceQueue();//reference will be stored in this queue for cleanup
DigitalCounter digit= new DigitalCounter();
PhantomReference<DigitalCounter> phantom= new PhantomReference<DigitalCounter>(digit, refQueue);
引用实例被添加在引用队列中,你可以再任何时候通过查询引用队列回收对象。一个对象的生命周期可以通过下图进行
在新窗口打开图片
这就是Java中弱引用和软引用的区别。我们还学到了一些基本的引用类:弱引用、软引用、虚引用以及WeakHashMap和WeakHashMap。总之,合理的使用引用可以帮助垃圾回收器更好的管理Java内存。
OK,本文到此结束,希望对大家有所帮助。