首页 > 其他分享 >强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?

强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?

时间:2023-04-27 09:33:39浏览次数:30  
标签:缓存 收集 对象 幻象 场景 引用 垃圾

典型回答不同的引用类型,

主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。

所谓强引用(“Strong” Reference),就是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了,当然具体回收时机还是要看垃圾收集策略。

 

软引用(SoftReference),是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾收集,只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象。JVM 会确保在抛出 OutOfMemoryError 之前,清理软引用指向的对象。软引用通常用来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。

 

弱引用(WeakReference)并不能使对象豁免垃圾收集,仅仅是提供一种访问在弱引用状态下对象的途径。这就可以用来构建一种没有特定约束的关系,比如,维护一种非强制性的映射关系,如果试图获取时对象还在,就使用它,否则重现实例化。它同样是很多缓存实现的选择。

 

对于幻象引用,有时候也翻译成虚引用,你不能通过它访问对象。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制,比如,通常用来做所谓的 Post-Mortem 清理机制,我在专栏上一讲中介绍的 Java 平台自身 Cleaner 机制等,也有人利用幻象引用监控对象的创建和销毁。

 

考点分析这道面试题,属于既偏门又非常高频的一道题目。说它偏门,是因为在大多数应用开发中,很少直接操作各种不同引用,虽然我们使用的类库、框架可能利用了其机制。它被频繁问到,是因为这是一个综合性的题目,既考察了我们对基础概念的理解,也考察了对底层对象生命周期、垃圾收集机制等的掌握。充分理解这些引用,对于我们设计可靠的缓存等框架,或者诊断应用 OOM 等问题,会很有帮助。比如,诊断 MySQL connector-j 驱动在特定模式下(useCompression=true)的内存泄漏问题,就需要我们理解怎么排查幻象引用的堆积问题。知识扩展1.

标签:缓存,收集,对象,幻象,场景,引用,垃圾
From: https://www.cnblogs.com/zeenzhou/p/17358017.html

相关文章

  • 优化项目场景
    优化针对项目场景而言,我其实也是思考了挺多的,然后,就一直努力尝试将自己代入患者的角度(因为我本人去医院的次数比较少,对医院的流程并不了解,也并不熟悉),也就只能通过询问朋友,加上百度啥的,然后就是通过患者的角度,我会去想一想他们对于医院这种挂号流程会有什么样的想法,尽量做到既能......
  • 如何在jmeter中把响应中的数据提取出来并引用
     jmeter做接口测试过程中,经常遇到请求需要用到token的时候,我们可以把返回token的接口用后置处理器提取出来,但是在这种情况下,只能适用于当前的线程组,其他线程组无法引用到提取的token变量值,所以必须要生成全局变量让测试计划下的所有线程组都可以引用变量。同一个线程组下提......
  • 深入java虚拟机 - 垃圾收集 - 引用计数收集器
         引用计数是垃圾收集的早期策略。在这种方法中,堆中每一个对象都有一个引用计数。一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对象的引用计数被置为1。当任何其他变量被赋值为对这个对象的引用时,计数加1。当一个对象的引用超过了......
  • element-ui el-dialog中引用组件,为何组件只加载一次
    最近开发项目,页面中引入组件,2次展示,组件中生命周期都不调取,导致网组件中传的值不更新;<el-dialogv-dialogDragtitle="巡检记录":visible.sync="patrolItemVisible":show-close="true":close-on-press-escape="true":close-on-click-modal="true":appen......
  • 引用 maxmind golang 库导致的程序无法 recover crash 的问题
    新做的Gateway程序打算使用一个maxmind第三方库来解析地理信息,想了一下比较简单找了一个库直接使用。项目跑了一天得到了一堆panic,程序崩溃超过1s丢了不少数据。 从stack信息可以看到调用amxminddb-golang这个库的readLeft出现了错误,最后抛出了一个unexceptedf......
  • 深入思考右值引用
    一般来说引用指的是左值引用,它存在的目的是为了给左值起个别名。在C++新版本里面出了一个新的概念——右值引用。类比前面对左值引用的理解,右值引用是应该是对右值起的别名。不过这个所谓的右值引用已经不能用右值的方式来理解,往常对右值的认识一般以常量居多,但是这个被起别名的......
  • 不可见字符换行符引发的测试场景遗漏
    不可见(不可以被直接打印)字符有95;测试页面输入时,输入内容带有不可见字符;提交数据时,数据中包含了不可见字符;未过滤掉敏感词经常遇见的有空格、换行字符 ......
  • 左值、右值、左值引用和右值引用
     文章目录左值和右值什么是左值和右值?举例说明程序分析左值引用和右值引用什么是左值引用和右值引用?左值引用右值引用(important!!!)左值和右值的转换左值变右值右值变左值左值和右值什么是左值和右值?按照我们常规理解左值就是在等号左边的值,右值是等号右边的值。如果你要这么理......
  • 左值、左值表达式、左值引用 C++
     本文topics什么是左值和右值什么是左值表达式、右值表达式引用的分类之前学习Java的时候只记得在赋值表达式左边的就是左值,右边的就是右值。这个说法没有错,但今天又在C++中有学习到了关于左右值得概念,在此梳理了一些这些知识点。左值和右值左值:左值是一个对象或变量,可以代表......
  • 不同语言加载不同字号,设置到资源文件中,进行引用
    在资源文件夹创建一个类在App.xaml文件中引用这个类的空间命名,并把这个类添加到资源在页面中应用在使用其他语言时,开启新的子线程依然会使用区域语言.net4.5后使用可以一次性解决varculture=newCultureInfo("en-US");    CultureInfo.DefaultThreadCurrent......