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

JVM——几种常见的对象引用

目录

  • 1. 软引用
    • 软引用的使用场景-缓存
  • 2.弱引用
    • 3.虚引用和终结器引用

可达性算法中描述的对象引用,一般指的是强引用,即是GCRoot对象对普通对象有引用关系,只要这层关系存在,
普通对象就不会被回收。除了强引用之外,Java中还设计了几种其他引用方式:
⚫ 软引用
⚫ 弱引用
⚫ 虚引用
⚫ 终结器引用

1. 软引用

软引用相对于强引用是一种比较弱的引用关系,如果一个对象只有软引用关联到它,当程序内存不足时,就会将软引用中的数据进行回收。
在JDK 1.2版之后提供了SoftReference类来实现软引用,软引用常用于缓存中
在这里插入图片描述
软引用的执行过程如下:

  • 1.将对象使用软引用包装起来,new SoftReference<对象类型>(对象)。
  • 2.内存不足时,虚拟机尝试进行垃圾回收。
  • 3.如果垃圾回收仍不能解决内存不足的问题,回收软引用中的对象。
  • 4.如果依然内存不足,抛出OutOfMemory异常在这里插入图片描述
    软引用中的对象如果在内存不足时回收,SoftReference对象本身也需要被回收。如何知道哪些SoftReference对象需要回收呢?
    SoftReference提供了一套队列机制:
  • 1、软引用创建时,通过构造器传入引用队列
  • 2、在软引用中包含的对象被回收时,该软引用对象会被放入引用队列
  • 3、通过代码遍历引用队列,将SoftReference的强引用删除

在这里插入图片描述

软引用的使用场景-缓存

软引用也可以使用继承自SoftReference类的方式来实现,StudentRef类就是一个软引用对象。通过构造器传入软引用包含的对象,以及引用队列。在这里插入图片描述
使用软引用实现学生数据的缓存:在这里插入图片描述
软引用如果被回收,要清理HashMap中的key。

2.弱引用

弱引用的整体机制和软引用基本一致,区别在于弱引用包含的对象在垃圾回收时,不管内存够不够都会直接被回收。在JDK 1.2版之后提供WeakReference类来实现弱引用,弱引用主要在ThreadLocal中使用。

弱引用对象本身也可以使用引用队列进行回收。在这里插入图片描述

3.虚引用和终结器引用

⚫ 这两种引用在常规开发中是不会使用的。


⚫虚引用也叫幽灵引用/幻影引用,不能通过虚引用对象获取到包含的对象。虚引用唯一的用途是当对象被垃圾回收器回收时可以接收到对应的通知。Java中使用PhantomReference实现了虚引用,直接内存中为了及时知道直接内存对象不再使用,从而回收内存,使用了虚引用来实现。


⚫终结器引用指的是在对象需要被回收时,终结器引用会关联对象并放置在Finalizer类中的引用队列中,在稍后由一条由FinalizerThread线程从队列中获取对象,然后执行对象的finalize方法,在对象第二次被回收时,该对象才真正的被回收。在这个过程中可以在finalize方法中再将自身对象使用强引用关联上,但是不建议这样做。


http://www.kler.cn/a/145179.html

相关文章:

  • 【AI非常道】二零二五年一月(二),AI非常道
  • “星门计划对AI未来的意义——以及谁将掌控它”
  • 2025一区新风口:小波变换+KAN!速占!
  • Java---入门基础篇(上)
  • 前端-Rollup
  • Visual Studio Code修改terminal字体
  • 不存在类型变量 A, T 的实例,使 Collector<T, A, List<T>> 符合 Supplier<R>
  • 从零开始搭建博客网站-----构建项目
  • 探索 Linux vim/vi 编辑器:介绍、模式以及基本操作演示
  • 【深度学习】如何选择神经网络的超参数
  • 排查生产环境:MySQLTransactionRollbackException数据库死锁
  • Meta最新视频生成工具:emu video技术报告解读
  • HarmonyOS应用开发者高级认证【题库答案】
  • 使用Java编写串口程序
  • Linux服务器SSH客户端断开后保持程序继续运行的方法
  • 【图像加密】Arnold置乱和混沌加密-MATLAB代码
  • 2分钟快速实现非逻辑卷磁盘扩容
  • Ubuntu 22.04安装vscode
  • Atlassian午餐会直播回顾:如何拓展Jira工作流,加强团队协作?
  • python基础 — 可迭代对象,迭代器和生成器
  • module java.base does not “opens java.io“ to unnamed module
  • 影刀RPA_boss直聘翻页(避坑)
  • 京东数据采集(京东数据运营):怎样快速获取京东市场大数据?
  • Centos 7 环境下 PostgreSQL 14 启用SSL加密
  • 【Linux】系统初始化配置
  • 代码随想录算法训练营第四十六天|139.单词拆分、背包问题总结