当前位置: 首页 > news >正文

#中的引用型是什么意识_Java中四种引用有什么区别以及应用场景

作为Java工程师,在面试时,经常会被问道,强引用、软引用、弱引用,虚引用有什么区别以及应用场景?或者聊聊Java都有哪几种引用以及它们的应用场景?

  其实这个问题,本身不难,但是由于在日常工作或者开发时,很少用到,以至于大家对其概念比较模糊,记不住。在这,总结一下,方便自己以后查询以及加深记忆。

a616041d2c108f06a163fa7f607c5f9d.png

  首先,不同引用类型,主要体现的是对象不同的可达性状态和对垃圾回收的影响。

  强引用(StrongReference),最普通的对象引用,只要还有强引用指向一个对象,就能表明对象还“或者”,垃圾回收器不会回收这个对象。当引用赋值为null,表明这个对象可以被垃圾收集了,具体的回收时机要看垃圾收集策略。强引用有如下特点:

  •   强引用可以直接访问目标对象。
  •   强引用所指向的对象在任何时候都不会被系统回收。
  •   强引用可能导致内存泄漏。

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

SoftReference bean = new SoftReference(new Bean("name", 10)); System.out.println(bean.get());// “name:10”

  软引用有以下特征:

  •   软引用使用 get() 方法取得对象的强引用从而访问目标对象。
  •   软引用所指向的对象按照 JVM 的使用情况(Heap 内存是否临近阈值)来决定是否回收。
  •   软引用可以避免 Heap 内存不足所导致的异常

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

  弱引用有以下特征:

  •   弱引用使用 get() 方法取得对象的强引用从而访问目标对象。
  •   一旦系统内存回收,无论内存是否紧张,弱引用指向的对象都会被回收。
  •   弱引用也可以避免 Heap 内存不足所导致的异常。

  虚引用(PhantomReference),也叫幻象引用,通过PhantomReference类来实现。无法通过虚引用访问对象的任何属性或函数。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

  程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取一些程序行动。

ReferenceQueue refQueue = new ReferenceQueue();PhantomReference referent = new PhantomReference(new String("T"), refQueue);System.out.println(referent.get());// null

  可用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。更多Java学习资料,可以关注“武汉千锋“微信公众号!

相关文章:

  • CSDN F2F北京.NET程序人生研讨会活动报道
  • hostconfig.undeploy 正在取消部署_重要!市自然资源局紧急部署落实防御台风工作...
  • 几个习惯用法
  • 小数分数百分数的互化_青岛版六年级上册数学7.2小数、分数和百分数的互化微课知识点精讲+练习...
  • asp中打开usb摄像头_USB是什么
  • 关掉cmd.exe下面的输入法切换
  • aspx后台调用前台jquery_jquery调用asp.net 页面后台方法-阿里云开发者社区
  • 一个手机上的网络聊天游戏(图)
  • cxf 统一返回_cxf开发webservice服务器+客户端(各种类型的参数传递返回)
  • 基于回合制的在线棋类对战游戏(图)
  • php 仿面包网 源码 飞飞cms_2020最新2017最新仿面包网模板 电影网站源码 带下载功能mianbao9源码...
  • 本周技术关注[面向webapps运维]:MSSQL2005 数据备份、恢复、数据复制等
  • java stream 多个filter_Java Stream API中多个和单个filter有性能差异吗?
  • 人月神話
  • 怎么使图表居中显示_太神奇了,这4种图表居然不用图表功能也能做
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [译] 怎样写一个基础的编译器
  • 07.Android之多媒体问题
  • Angular数据绑定机制
  • emacs初体验
  • JavaScript类型识别
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • laravel with 查询列表限制条数
  • Laravel 中的一个后期静态绑定
  • LeetCode18.四数之和 JavaScript
  • Mysql5.6主从复制
  • rabbitmq延迟消息示例
  • Spring Boot快速入门(一):Hello Spring Boot
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • XML已死 ?
  • 分布式事物理论与实践
  • 记一次用 NodeJs 实现模拟登录的思路
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 深度解析利用ES6进行Promise封装总结
  • 事件委托的小应用
  • 我有几个粽子,和一个故事
  • 一些css基础学习笔记
  • 由插件封装引出的一丢丢思考
  • - 转 Ext2.0 form使用实例
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 阿里云服务器如何修改远程端口?
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #NOIP 2014# day.1 T2 联合权值
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (4) PIVOT 和 UPIVOT 的使用
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (ibm)Java 语言的 XPath API
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (力扣)1314.矩阵区域和
  • (十) 初识 Docker file
  • (转)fock函数详解
  • **PHP二维数组遍历时同时赋值