Java中被你忽视的四种引用

正文开始前,有必要先了解下Java内存分配与回收,请见我的相关博文。

——————————————————————————————————

Java的数据类型分为两类:基本数据类型、引用数据类型。

基本数据类型的值存储在栈内存中,而引用数据类型需要开辟两块存储空间,一块在堆内存中,用于存储该类型的对象;另一块在栈内存中,用于存储堆内存中该对象的引用。

其中引用类型变量分为四类:

1)强引用

最常用的引用形式。把一个对象赋给一个引用类型变量,则为强引用。

只要一个引用是强引用,则垃圾回收器永远都无法回收这个对象的内存空间,除非JVM终止。

2)软引用

当内存资源充足的时候,垃圾回收器不会回收软引用对应的对象的内存空间;但当内存资源紧张时,软引用所对应的对象就会被垃圾回收器回收。

//创建一个Person类型的软引用
SoftReference<Person> sr = new SoftReference<Person>(new Person());

3)弱引用

不管JVM内存资源是否紧张,只要垃圾回收器运行,弱引用所对应的对象就会被释放。

4)虚引用

虚引用等于没有引用,无法通过虚引用访问其对应的对象。

软引用和弱引用在其对象被回收之后,这些引用会被添加到引用队列中去;而虚引用在其对象被回收之前,虚引用就被添加到引用队列中去了。因此虚引用可以在其对象被释放之前进行一些操作。

虚引用和引用队列绑定的方法:

//创建引用队列
ReferenceQueue<String> queue = new ReferenceQueue<String>();
//创建虚引用,并绑定引用队列
PhantomReference<String> str = new PhantomReference<String>("啦啦啦",queue);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python爱好者

Java基础笔记09

813
来自专栏Python研发

面向对象进阶篇

注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存...

763
来自专栏杨龙飞前端

js中的valueOf与toString

2584
来自专栏Java架构师进阶

Java程序员实现完美代码的十大要素

对于方法的注释应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述;类的注释应该包含类的功能说明、作者和修改者。

652
来自专栏专注 Java 基础分享

全面理解java异常机制

      在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大牛,你也不可避免出错,所以java为我们提供了异常机制。本文将会从以下几个方面...

1877
来自专栏代码世界

Python之匿名函数

匿名函数 匿名函数:为了解决那些功能很简单的需求而设计的一句话函数。 #这段代码 def calc(n): return n**n print(calc...

3289
来自专栏程序员互动联盟

【编程基础第十二讲】web开发编程基础--回调函数

存在问题: 我们都知道C语言存在回调函数,那么JavaScript中的回调函数是如何实现的? 如何实施: a.非参数回调函数 这类回调函数大多比较简单,往往传一...

2285
来自专栏练小习的专栏

js运算符优先级笔记

运算符的优先级决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行。 下面是一个简单的例子: 3 + 4 * 5 // 计算结果为23 乘法运算符...

1828
来自专栏郭耀华‘s Blog

Java集合框架(一)—— Collection、Iterator和Foreach的用法

1.Java集合概述   在编程中,常常需要集中存放多个数据。当然我们可以使用数组来保存多个对象。但数组长度不可变化,一旦在初始化时指定了数组长度,则这个数组长...

3059
来自专栏Java学习网

Java中的内存泄漏学习

Java中的内存泄漏学习   Java语言的一个关键的优势就是它的内存管理机制。你只管创建对象,Java的垃圾回收器帮你分配以及回收内存。然而,实际的情况并没...

2098

扫描关注云+社区