博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一般人的不知道的Java 的四种引用类型
阅读量:4293 次
发布时间:2019-05-27

本文共 1068 字,大约阅读时间需要 3 分钟。

Java资源共享 2017-12-14 09:53:56

Java有四种引用类型,strongreference,softreference,weakreference,phantomreference。这四种引用的强度按照上面的顺序依次减弱,下面通过几个例子简单了解一下这四种引用类型。

StrongReference

这个不用多讲了,这是 java 默认的引用类型,如果不特意使用 java.lang.ref 下的类,那么程序中的所有引用都是强引用。有强引用存在的对象永远都不会被 gc 收集,所以在内存不够用时,JVM 宁愿抛出 OutOfMemoryError 这样的错误,也不愿意将强引用对象进行回收。

一般人的不知道的Java 的四种引用类型

Java

SoftReference

软引用不会保证对象一定不会被回收,只能最大可能保证。如果内存有剩余,那么软引用对象不会被回收,如果内存不足,那么 gc 会回收软引用对象。所以这种特性可以用来实现缓存技术。软引用要用 java.lang.ref.SoftReference 来实现。

一般人的不知道的Java 的四种引用类型

Java

WeakReference

除了通过 java.lang.ref.WeakReference 来使用弱引用,WeakHashMap 同样也利用了弱引用。和软引用不同的是,弱引用一定会被 gc 回收,不管内存是否不足。

一般人的不知道的Java 的四种引用类型

Java

PhantomReference

幽灵引用,也叫虚引用。java.lang.ref.PhantomReference 类中只有一个方法 get(),而且几乎没有实现,只是返回 null。而且这个类只有一个构造器 ( 软引用和弱引用均有两个构造器): 也就是说,幽灵引用只能与 ReferenceQueue(后面会提到这个类)一起使用。如果一个对象仅有幽灵引用,那么它就像没有任何引用一样,在任何时候都可能被 gc 回收。幽灵引用主要用来跟踪对象被垃圾回收的活动。ReferenceQueue 如果一个对象只有软引用、弱引用或者幽灵引用,gc 在回收对象时,JVM 会自动将其引用放入一个 ReferenceQueue 中。WeakHashMap 就是利用了 ReferenceQueue 来实现清除没有强引用 Entry 的。将上面的弱引用例子稍微改一下:

一般人的不知道的Java 的四种引用类型

Java

注意,运行这个程序需要用 debug 模式进行调试,在上面说明的地方加个断点。如果直接运行,结果很可能只是个 null,用 debug 调试的话会看到输出的是弱引用的地址。程序输出的 sf 结果和 rq.poll() 结果相同。

转载地址:http://obzws.baihongyu.com/

你可能感兴趣的文章
FFmpeg 的介绍与使用
查看>>
Android 虚拟机简单介绍——ART、Dalvik、启动流程分析
查看>>
原理性地理解 Java 泛型中的 extends、super 及 Kotlin 的协变、逆变
查看>>
FFmpeg 是如何实现多态的?
查看>>
FFmpeg 源码分析 - avcodec_send_packet 和 avcodec_receive_frame
查看>>
FFmpeg 新旧版本编码 API 的区别
查看>>
RecyclerView 源码深入解析——绘制流程、缓存机制、动画等
查看>>
Android 面试题整理总结(一)Java 基础
查看>>
Android 面试题整理总结(二)Java 集合
查看>>
ubuntu18机器学习环境安装基于anaconda
查看>>
指定jupyter运行的conda环境和报错处理generator_to_async_generator
查看>>
alphalens入门篇,重要图表绘制和含义
查看>>
pandas dataframe多重索引常用操作
查看>>
CTA分类
查看>>
国内4种常用日内CTA策略介绍及实现
查看>>
seaborn常用速查手册
查看>>
机器学习与股价预测
查看>>
量化中需留意的坑之一
查看>>
量化策略开发中的参数调优
查看>>
常见期权策略一览(期权,组合)
查看>>