Java的四种引用方式

 更新时间:2021年10月28日 17:20:27   作者:Android帅次  
这篇文章主要介绍了Java的四种引用方式,Java的引用方式主要包括强引用、软引用、弱引用、虚引用;下面文章便来详细介绍这四种引用方式,需要的朋友可以参考一下

1.强引用(StrongReference)

  • 使用最普遍的引用。
  • 只要引用链没有断开,强引用就不会断开。- 当内存空间不足,抛出OutOfMemoryError终止程序也不会回收具有强引用的对象。
  • 通过将对象设置为null来弱化引用,使其被回收
Object object = new Object();
String str = "scc";
//都是强引用

2.软引用(SoftReference)

  • 对象处在有用但非必须的状态
  • 只有当内存空间不足时, GC会回收该引用的对象的内存。
  • 可以用来实现高速缓存(作用)--比如网页缓存、图片缓存
// 注意:wrf这个引用也是强引用,它是指向SoftReference这个对象的,
// 这里的软引用指的是指向new String("str")的引用,也就是SoftReference类中T
SoftReference<String> wrf = new SoftReference<String>(new String("str"));

3.弱引用(WeakReference)

弱引用就是只要JVM垃圾回收器发现了它,就会将之回收。

  • 非必须的对象,比软引用更弱一-些
  • GC时会被回
  • 被回收的概率也不大,因为GC线程优先级比较低
  • 适用于引用偶尔被使用且不影响垃圾收集的对象 使用:
Map<Key, ResourceWeakReference> activeEngineResources = new HashMap<>();
//ResourceWeakReference弱引用

4.虚引用(PhantomReference)

  • 不会决定对象的生命周期
  • 任何时候都可能被垃圾收集器回收
  • 跟踪对象被垃圾收集器回收的活动,起哨兵作用
  • 必须和引用队列ReferenceQueue联合使用

        当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。

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

Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference reference = new PhantomReference(obj, queue);
//强引用对象滞空,保留软引用
obj = null;

5. 引用队列(ReferenceQueue)

  • 无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达
  • 存储关联的且被GC的软引用,弱引用以及虚引用
到此这篇关于Java的四种引用方式的文章就介绍到这了,更多相关Java引用方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis拦截器实现数据权限项目实践

    mybatis拦截器实现数据权限项目实践

    本文主要介绍了mybatis拦截器实现数据权限项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 浅析SpringBoot2.4 静态资源加载问题

    浅析SpringBoot2.4 静态资源加载问题

    这篇文章主要介绍了SpringBoot2.4 静态资源加载问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • java实现简单计算器功能

    java实现简单计算器功能

    这篇文章主要为大家详细介绍了java实现简单计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • java 中volatile和lock原理分析

    java 中volatile和lock原理分析

    这篇文章主要介绍了java 中volatile和lock原理分析的相关资料,需要的朋友可以参考下
    2017-03-03
  • 详解Spring数据缓存注解@Cacheable、@CachePut、@CacheEvict

    详解Spring数据缓存注解@Cacheable、@CachePut、@CacheEvict

    这篇文章主要介绍了详解Spring数据缓存注解@Cacheable、CachePut、@CacheEvict,当以一组参数第一次调用某个方法时,返回值会被保存在缓存中,如果这个方法再次以相同的参数进行调用时,这个返回值会从缓存中查询获取,需要的朋友可以参考下
    2023-07-07
  • java能写爬虫程序吗

    java能写爬虫程序吗

    在本篇文章里小编给大家整理的是一篇关于java是否能写爬虫程序的一篇文章,对此有兴趣的朋友们可以学习下。
    2021-01-01
  • 解析MyBatisPlus解决逻辑删除与唯一索引的兼容问题

    解析MyBatisPlus解决逻辑删除与唯一索引的兼容问题

    这篇文章主要介绍了MyBatisPlus解决逻辑删除与唯一索引的兼容问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Java解决计算相邻两个数的最大差值的问题

    Java解决计算相邻两个数的最大差值的问题

    今天给大家带来一道算法题:给定一个数组,求如果排序之后,相邻两数的最大差值。要求时间复杂度O(N),且要求不能用非基于比较的排序。快来跟随小编一起学习一下如何解决这一问题吧
    2021-12-12
  • 详解spring cloud ouath2中的资源服务器

    详解spring cloud ouath2中的资源服务器

    这篇文章主要介绍了spring cloud ouath2中的资源服务器的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • json-lib将json格式的字符串,转化为java对象的实例

    json-lib将json格式的字符串,转化为java对象的实例

    下面小编就为大家带来一篇json-lib将json格式的字符串,转化为java对象的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03

最新评论