强引用/软引用/弱引用/虚引用解析和应用场景分析
我们平常普通写的 Object a=new object(); 创建对象就是一种强引用
当内存不足,JVM开始垃圾回收, 对于强引用的对象,就算是出现了OOM也不会对该对象进行回收
强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的, 即使该对象以后永远都不会被用到JVM也不会回收。 因此强引用是造成Java内存泄漏的主要原因之一。
对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为null,一般认为就是可以被垃圾收集的了(当然具体回收时机还是要看垃圾收集策略)。
SoftReference<Object> softReference=new SoftReference<>(o1);
软引用是一种相对强引用弱化了一些的引用,需要用java.lang.ref.SoftReference类来实现,可以让对象豁免一些垃圾收集。
对于只有软引用的对象来说,
当系统内存充足时它不会被回收
当系统内存不足时它会被回收。
软引用通常用在对内存敏感的程序中,比如高速缓存就有用到软引用, 内存够用的时候就保留,不够用就回收!
弱引用需要用java.lang.ref.WeakReference类来实现,它比软引用的生存期更短
对于 只有弱引用的对象 来说,只要垃圾回收机制一运行, 不管JVM的内存空间是否足够,都会回收该对象占用的内存。
软引用/弱引用应用场景
场景模拟:
假如有一个应用需要读取大量的本地图片:
如果每次读取图片都从硬盘读取则会严重影响性能,如果一次性全部加载到内存中又可能造成内存溢出。
此时使用软引用可以解决这个问题。
弱引用之WeakHashMap
它是一个特殊的HashMap,属于import java.util.WeakHashMap;与HashMap平级;
它的特殊之处在于当它的某个键值对中的键失效或者为NULL的时候.弱此时发生了GC,那么该键值对将从WeakHashMap中移除;
注意若上述的key=Integer.valueOf(5),若这里key=null,不会让map移除这个键值对,因为这里key指向的是一个值而不是一个引用,当map.put时候直接把值放进去了,所以key=null时候不会影响 WeakHashMap
下面要将虚引用,在此之前,我们需要先了解一个东西,ReferenceQueue
软引用,弱引用,虚引用在创建时候可以直接传一个对象其实他们还有另外有一个构造方法是传一个对象和一个引用队列,这样会使他们回收之前保存到Reference里.
虚引用
虚引用需要java.lang.ref.PhantomReference类来实现。顾名思义,就是 形同虚设 ,与其他几种引用都不同,虚引用并不会决定对象的生命周期。
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收 ,它不能单独使用也不能通过它访问对象, 虚引用必须和引用队列(ReferenceQueue)联合使用。
虚引用的主要作用是 跟踪对象被垃圾回收的状态 。仅仅是提供了一种确保对象被finalize以后,做某些事情的机制。PhantomReference的get方法总是返回null,因此无法访问对应的引用对象。 其意义在于说明一个对象已经进入finalization阶段,可以被gc回收,用来实现比finalization机制更灵活的回收操作。
换句话说, 设置虚引用关联的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理。
Java 技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
四大引用和GCroot的杂糅
论文中引用的作用是什么?
间接引用是说:撰写者只引用原文的意思,不引用原文内容,通过对原文加工改写,只引用原文含义,间接引用前后不需要加引号,但是要显示起止界限。间接引用是为了让文字表述更加流畅,便于读者阅读。间接引用必须完整理解原文含义,切忌扭曲原本含义,或者是断章取义进行引用。3、综合引用 综合引用就是将直接引用...
引用类型有哪些
引用类型主要有以下几种:1. 直接引用:这是最常见的一种引用类型。在文本中直接插入特定人物、作品或事件的原文,以此作为证据或说明。这种引用方式简单明了,能够直接展现原始资料的内容。2. 间接引用:间接引用是通过使用第三人称转述他人的观点或话语,而不是直接引用原文。这种引用方式可以更加灵活地传...
引用的定义
引用的定义如下:引用是指在自己的文章、作品或发言中,使用别人出版物、语录、评论、观点、图表等内容时,按照一定方式列入参考文献、注释或脚注中,并标注原出处,以表明这一内容不是自己原创,而是来自别人的作品或观点。引用可以增强自己的论证力度,同时也要遵守知识产权法律法规并尊重原作者的知识产权。
引用的作用
1、引用的内容可以增加文章的说服力,使文章更加有血有肉。2、引用可以丰富文章的内容,增强文章的可读性。3、引用可以证明观点,使文章更有力量。4、引用可以提供权威的论据,增加文章的说服力。5、引用可以为读者提供更多的背景信息,帮助读者更好地理解文章的背景和主题。6、引用可以启发读者的思考,引...
什么是引用,如何正确引用?
1.直接引用:一句诗、名言、话语等,你没有对原文进行修改就直接使用就是直接引用。举例:妈妈说:“明天我不能来接你了。”2.间接引用:同样的一句话、一句诗、一句名言,你用自己的方式表达出来就是间接引用。举例:妈妈说,明天她不能来接我了。引用的定义:是一种修辞手法,引用成语、诗句、格言...
什么是论文的引用和被引用?
引用是指通过援引或引用文献中的某篇文章、某个观点或某段文字,来支持或证明自己的论点或作出论文的结论。文章的被引用数量越多,代表其影响力越大,是衡量学术成果的一个重要指标。在学术界,被引用数量也被用作评价一个学者学术地位的指标之一。因此,被引用次数可以反映出某一篇论文的学术价值。被...
引用是什么意思?
引用是指在说话或写作中引用现成的话,如诗句、格言、成语等,以表达自己思想感情的修辞方法。引用可分为明引暗引两种。明引指直接引用原文,并加上引号,或者是只引用原文大意,不加引号,但是都注明原文的出处。暗引指不说明引文出处,而将其编织在自己的话语中,或是引用原句,或是只引大意。运用...
引用的类型有哪些?
暗引:直接把引用的话组织在自己的语言里,不说明出处、来源的引用叫“暗引”。暗引需要融进作者的句子,不需要冒号,句号在作者句子后面。但引句要准确,并加引号。【例】登上泰山顶峰,俯瞰群山奔涌,真可谓“会当凌绝顶,一览众山小”了。意引:引句不是原句,只包含大概意义,语言由作者自己组织...
引文和引用的区别
来源、使用方式等区别。1、来源:引文是对其他文本的直接引用,包括作者、出版年份、引文的具体内容等信息。直接从原文中摘录出来,保持原文的准确性和完整性。引用则是对其他文本的概括或转述,不一定包括具体的引文内容。可以是对原文的总结、归纳、提炼,以便更好地传达作者的观点。2、使用方式:引文的...
“引资料”和“引用”有什么区别呢?
“引资料”和“引用”的区别:引资料这是说明文的写作方式,引用主要是引用名人的话而举例子是用事情来说明。引资料(引用):引用诗句、名言、格言、谚语,以及神话传说、新闻报道、谜语、轶事趣闻、文献资料等。语言特征:引号。作用:使说明更有说服力或增强说明的趣味性。如果在文章的开头,还有引起说明...
巧诗小儿: 我自己也复习下概念. 强引用:就是普通引用.比如 A o1=new A(); A o2=o1; 强引用只有当所有对这个对象的所有引用(o1,o2)失效后,new A()的内存才会被回收.残影引用、弱引用、软引用都用来引用随时可能被回收的对象.类似o1,o2即使未失效也会回收. 区别是被回收器回收的激烈程度,由强到弱.残影引用是对象已经finalize或者执行完析构函数,只等内存马上回收了,最容易被回收.非常接近回收时机,就像残影会随物体消失而消失,故名. 弱引用的对象是在正常情况下,回收器遇到就回收,是被积极回收的对象. 软引用是仅在内存不够时才回收,属于消极回收.
丁青县17179983276: Java 关于强引用,软引用,弱引用和虚引用的区别与用法 - ?
巧诗小儿: 强引用: 只要引用存在,垃圾回收器永远不会回收 Object obj = new Object(); //可直接通过obj取得对应的对象 如obj.equels(new Object()); 而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉...
丁青县17179983276: Java中的几种引用方式 - ?
巧诗小儿: Java中有几种不同的引用方式,它们分别是:强引用、软引用、弱引用和虚引用.下面,我们首先详细地了解下这几种引用方式的意义. 强引用在此之前我们介绍的内容中所使用的引用都是强引用,这是使用最普遍的引用.如果一个对象具有...
丁青县17179983276: 分析java对象的几种引用(reference) - ?
巧诗小儿: java对象的引用reference分为有强引用,软引用,弱引用,虚引用这几种形式.1、Soft Reference(软引用)指到的对象,即使没有任何Direct Reference,也不会清除,一直到jvm内存不足且没有Direct Reference时候才会清除.应用场景:...
丁青县17179983276: Java中弱引用和软引用的区别以及虚引用和强引用介绍 - ?
巧诗小儿: Java中弱引用VS软引用 Java中有如下四种类型的引用:1.强引用(Strong Reference)2.弱引用(WeakReference)3.软引用(SoftReference)4.虚引用(PhantomReference) 强引用是我们在编程过程中使用的最简单的引用,如代码String s=...
丁青县17179983276: 谁能解释下JAVA中的强引用、弱引用、软引用、虚引用,尽量通俗点,谢谢!! - ?
巧诗小儿: 1.强引用 本章前文介绍的引用实际上都是强引用,这是使用最普遍的引用.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终...
丁青县17179983276: Java中的强引用,软引用,弱引用,虚引用有什么用 - ?
巧诗小儿: 强引用,任何时候都不会被;垃圾回收器回收,如果内存不足,宁愿抛出OutOfMemoryError 软引用,只有在内存将满的时候才会被垃圾回收器回收,如果还有可用内存,垃圾回收器不会回收 弱引用,只要垃圾回收器运行,就肯定会被回收,不...
丁青县17179983276: java中双重引用是什么 - ?
巧诗小儿: 我自己也复习下概念.强引用:就是普通引用.比如Ao1=newA();Ao2=o1;强引用只有当所有对这个对象的所有引用(o1,o2)失效后,newA()的内存才会被回收.残影引用、弱引用、软引用都用来引用随时可能被回收的对象.类似o1,o2即使未失效也会回收.区别是被回收器回收的激烈程度,由强到弱.残影引用是对象已经finalize或者执行完析构函数,只等内存马上回收了,最容易被回收.非常接近回收时机,就像残影会随物体消失而消失,故名.弱引用的对象是在正常情况下,回收器遇到就回收,是被积极回收的对象.软引用是仅在内存不够时才回收,属于消极回收.
丁青县17179983276: java有几种对象引用 - ?
巧诗小儿: 1.强引用(StrongReference) 强引用是java中最常见的一种引用方式,当一个程序创建一个对象,并把这个对象赋给一个引用变量,程序通过该引用变量操作实际的对象.当一个对象被一个或一个以上的引用变量所引用时,它处于可达状态,不...
丁青县17179983276: 弱引用(weakReference)和softReference有什么区别? - ?
巧诗小儿: 弱引用对象,它们并不禁止其指示对象变得可终结,并被终结,然后被回收.弱引用最常用于实现规范化的映射. 假定垃圾回收器确定在某一时间点上某个对象是弱可到达对象.这时,它将自动清除针对此对象的所有弱引用,以及通过强引用链...