Java虚拟机——引用

时间:2022-12-26 17:06:20

Java虚拟机——引用


目录


前言

之前在别人的面经中曾经看到过引用相关的问题,当时的第一反应是值传递和引用传递的相关知识,之后在看《深入理解Java虚拟机》的过程中才发现,原来面试过程中提到引用,想问的是Java虚拟机中对于引用的分类,根据分类的强度,分为强引用、软引用、弱引用、虚引用。

在看过书上的介绍后,感觉只是稍稍一提,并不作为一个重点进行讲述,因此又查询了一部分相关的知识,发现大家对这一部分都是浅尝辄止,可能这部分并没有什么太过深的内容可以进行挖掘,因此在这里只是浅浅的谈一下引用相关的内容。


引用定义

感觉对于引用的理解不需要我们去查找官方的言论,在这里就谈一下我对于引用的理解吧。

提到引用,首先想到的就是赋值语句,将一个对象赋值给一个变量,这个变量指向了这个对象,这就是我最普遍的引用了。

在Java的内存管理和内存回收过程中,程序员是不需要进行插手的,就GC过程而言,我们通过可达性分析算法来判断一个对象有没有被引用,倘若没有被引用的话,就会被JVM标记,有很大可能性会被回收。


引用的分类

在JDK1.2之前,Java中的引用定义很传统:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用,这种定义很纯粹,一个对象在这种定义下只有被引用或没有被引用两种状态。

在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为了四类:强引用,软引用,弱引用,虚引用。四种引用的强度依此减弱。

强引用

强引用是将一个对象赋值给一个变量。

是在Java程序中经常存在的类似

Object obj = new Object();

这类的引用,只要强引用还存在,垃圾收集器就永远不会回收掉被引用的对象。JVM即便抛出OutOfMemory错误也不会回收掉这类对象。
想要将这类对象回收的话,必须将指向该对象的引用赋值为null或其他对象。

软引用(SoftReference)

如果一个对象具有软引用,并且内存空间是足够的,那么垃圾收集器就不会回收它。

如果内存空间不足了,就会回收这些对象的内存。

软引用通常用来描述一些还有用但是并非必需的对象,比如说网页缓存、图片缓存等。

弱引用(WeakReference)

弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存岛下一次垃圾收集之前,GC时无论内存是否足够,都会对对象进行回收。

虚引用(PhantomReference)

虚引用也被称为幽灵引用或者幻影引用,它是最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象实例。设置虚引用的唯一目的就是能在这个对象被垃圾收集器回收时获得一个系统通知。


总结

这里对引用只是进行了一个简单的分类,大概讲述了它们可能的作用和对内存回收造成的影响,如果有对引用更深的需求的话可以看一下这篇博客,其中更详尽的用例子讲述了四类引用的应用场景。

JAVA四种引用方式


本文是个人学习过程中对了解到的引用相关知识的总结。

如有纰漏,敬请指正。