在java语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,理解引用对于掌握java对象生命周期和JVM内部相关机制非常有帮助。

今天问题:强引用、软引用、弱引用、幻想引用有什么区别?具体使用场景是什么?

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

强引用特点:我们平常典型编码Object obj=new Object()中obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用。当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM)使程序异常终止,也不会考随意回收具有强引用的“存活”对象来解决内存不足的问题。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显示的将相应(强)引用赋值为null,就可以被垃圾收集了,具体回收时机还要看收集策略。

软引用特点:软引用通过SoftReference类实现。软引用的生命周期比强引用短一些。只有JVM认为内存不足时,才会试图回收软引用指向的对象。软引用可以和一个引用队列联合使用。如果软引用所引用的对象被垃圾回收器回收,java虚拟机就会把这个软引用加到与之关联的引用队列中。后续可以调用poll()方法检查是否有他关心的对象被回收,空返回null,否则返回队列中前一个reference对象。

应用场景:软引用用来存储内存敏感的缓存。如果还有空闲内存,就可以暂时保存缓存,当内存不足时清理掉,这样就保证了使用缓存的同时不会耗尽内存。

弱引用特点:当垃圾回收器扫描他所管辖的内存区域时,一旦发现了弱引用的对象不管内存空间是否充足,都回收他的内存。

应用场景:弱引用同样适用于内存敏感的缓存。

虚引用、幻想引用特点;无法通过虚引用访问对象的任何属性或者函数

应用场景:用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。

最新文章

  1. 为easyui datagrid 添加上下方向键移动
  2. Maven-搭建普通maven项目
  3. 关于oracle sql developer乱码的问题
  4. android 单选、多选弹出菜单
  5. HDU4871 Shortest-path tree(树分治)
  6. (英文版)VScode一键生成.vue模板
  7. Android Studio 配置 androidAnnotations框架详细步骤
  8. centos7 使用二进制安装mysql 5.7.23
  9. $.ajax 方法参数总是记不住,在这里记录一下
  10. Android编译系统环境初始化过程分析
  11. angular学习笔记(三十)-指令(8)-scope
  12. [VB.NET][C#]调用API获取或设置键盘按键状态
  13. 使用子查询可提升 COUNT DISTINCT 速度 50 倍
  14. 【leetcode 简单】第二题 反转整数
  15. However, a general purpose protocol or its implementation sometimes does not scale very well.
  16. (USB HID) Configuration Descriptor
  17. 光流optical flow基本原理与实现
  18. 一个线程知识点, 一个MongoDB的知识点
  19. js 格式化相关的时间
  20. Unity---动画系统学习(4)---使用混合树(Blend Tree)来实现走、跑、转弯等的动画切换

热门文章

  1. Java keytool命令说明
  2. 2. nmap扫描神器总结
  3. 2019计蒜之道初赛4 B. 腾讯益智小游戏—矩形面积交(简单)(矩形交集)
  4. WebView根据加载的内容来控制其高度
  5. JavaScript 的基本语法
  6. Flask RESTful API搭建笔记
  7. spring boot 启动报:Composite-id class must implement Serializable: xxx错误
  8. MyEclipse 2016CI破解版for Mac
  9. shell编程 Shell script 的默认变量($0, $1...)
  10. HDU-3639-Hawk-and-Chicken(强连通,缩点,DFS)