首页编程java编程java什么时候用 弱引用?JAVA的软弱虚引用有什么用,主要在什么时候用

java什么时候用 弱引用?JAVA的软弱虚引用有什么用,主要在什么时候用

编程之家2023-10-14106次浏览

大家好,今天给各位分享java什么时候用 弱引用的一些知识,其中也会对JAVA的软弱虚引用有什么用,主要在什么时候用进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

java什么时候用 弱引用?JAVA的软弱虚引用有什么用,主要在什么时候用

java中什么是强引用,弱引用和软引用

我自己也复习下概念。

强引用:就是普通引用。比如 A o1=new A(); A o2=o1;

强引用只有当所有对这个对象的所有引用(o1,o2)失效后,new A()的内存才会被回收。

java什么时候用 弱引用?JAVA的软弱虚引用有什么用,主要在什么时候用

残影引用、弱引用、软引用都用来引用随时可能被回收的对象。类似o1,o2即使未失效也会回收。

区别是被回收器回收的激烈程度,由强到弱。

残影引用是对象已经finalize或者执行完析构函数,只等内存马上回收了,最容易被回收。非常接近回收时机,就像残影会随物体消失而消失,故名。

java什么时候用 弱引用?JAVA的软弱虚引用有什么用,主要在什么时候用

弱引用的对象是在正常情况下,回收器遇到就回收,是被积极回收的对象。

软引用是仅在内存不够时才回收,属于消极回收。

Java中的强引用,软引用,弱引用,虚引用有什么用

这两天在看 Reference相关的东西,虽然接触到的场景不多,但感觉还是比较有用的。

在非常关心内存的情况下,有可能能派上用场。

在涉及到某一个对象被 GC,需要得到通知,然后再做某些相关处理的时候,有可能派得上用场。

对于第一点,目前接触到的就是 WeakHahsMap。像我们平常写缓存的时候,最简单的就是在一个类中

public static Map<String,String> user_map= new HashMap<String, String>();

然后再在全局使用它。这里就可以参考下 Tomcat实现的这个 LRU缓存:tomcat/ConcurrentCache.java at trunk· apache/tomcat· GitHub,它就用到了 WeakHashMap,WeakHashMap也用到了 WeakReference,可以参考下。

WeakHahsMap的实现原理简单来说就是里面的 Entry使用继承了 WeakReference,那么当 Entry的 key不再被使用的时候,也就是被 GC的时候,那么该 Entry就会进入到 ReferenceQueue中, WeakHashMap在你调用相关方法的时候,那么就会把这个 Entry从 ReferenceQueue中删除,并且做相关处理(也就是把这个 key删除)。这时候你就会发现,你的一个键值对没有了。

对于第二点,目前接触到的就是一个 FileCleaningTracker,它的作用是,把一个文件和一个对象关联起来,当这个对象被 GC的时候,文件也帮我们删除掉。

FileCleaningTracker的实现简单来说就是用了一个虚引用。它里面有一个 Tracker的内部类,他继承自 PhantomReference,你可以理解成 WeakHashMap中的 Entry(其实也很像了)。这个 Tracker就和我们的关联对象 marker关联起来(你可以理解成 WeakHashMap中的 Entry的 key),那么当 marker被回收的时候,Tracker就会被GC弄到 ReferenceQueue中,那么 FileCleaningTracker就会把 Tracker从 ReferenceQueue移除出来,并且执行相关操作(delete file)。

最后:

自己理解的引用(强,软,弱虚)是和 GC比较相关的,能够在一个对象被 GC的时候,应用程序得到通知,然后执行相关操作。像 WeakHashMap就是这样,底层发现 key没了,上层就把 entry删了。

ps:

第6条:消除过期对象的引用(WeakHashMap的缓存应用):愿无岁月可回首

第6条:WeakHashMap扩展知识1(原理与Reference相关):愿无岁月可回首

第6条:Reference应用-FileCleaningTracker:愿无岁月可回首

最后的最后补充。。。

突然想起,之前自己在工作中涉及到这样一种情况,我需要对用户投资的钱进行一个每日的加息,有一天客户忘了把加息的数据给我,然后给了我一份 csv文件,让我加上。我当时的做法是,让运维把文件放在固定的地方,程序读取,执行逻辑,然后运维再手动删除。这个时候,其实也可以通过这种 FileCleaningTracker,当读取完之后,自动的删除这个文件,就不用运维来做了。(这可能是一种应用场景)

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的弱引用

你好,为了说明问题,给你举个例子加以说明:

String abc= new String("abcdf");

这就是创建了一个String的实例然后在变量abc中保存一个强引用,为什么说它强(Strong)呢?这是跟垃圾回收器相关的,如果一个对象是通过强引用链(Chain of Strong Reference)访问到的,也就是像上面那样,那么这个对象是不会被垃圾回收器回收的,这在正常情况下是正确的,因为你不想垃圾回收器回收你正在使用的对象。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemory错误,是程序异常终止,也不会为了解决内存不足而回收这类引用的对象。这就是使用强引用的一个问题,强引用的另外一个常见的问题就是缓存,特别是对于那些非常大的数据结构,像图片等等,平差情况下我们是希望程序能缓存这些大的数据结构的,因为重新加载非常耗费服务器资源。因为缓存就是为了避免重新加载这些大的数据结构的,所以缓存中会保存一个指向内存中数据结构的引用,而这些引用通常都是强引用,所以这些引用会强迫这些大的数据结构保存在内存中,除非用通过某些方法户知道哪一个数据结构不再需要保存在内存中了,然后再把他从缓存中清除。

弱引用就是不保证不被垃圾回收器回收的对象,它拥有比较短暂的生命周期,在垃圾回收器扫描它所管辖的内存区域过程中,一旦发现了只具有弱引用的对象,就会回收它的内存,不过一般情况下,垃圾回收器的线程优先级很低,也就不会很快发现那些只有弱引用的对象。

弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用的对象被垃圾回收的话,Java虚拟机就会把这个弱引用加入相关的引用队列中。

一下就是创建弱引用对象的例子。

String abc= new String("abcde");

WeakReference<String> wf= new WeakReference<String>(str, rq);

String abc1= wf.get()//如果abcde这个对象没有被垃圾回收器回收,那么abc1就指向"abcde"对象

好了,文章到这里就结束啦,如果本次分享的java什么时候用 弱引用和JAVA的软弱虚引用有什么用,主要在什么时候用问题对您有所帮助,还望关注下本站哦!

javaweb可以用什么?javaweb可以用什么开发1280x720 1280x720分辨率是多少