什么是引用?
在聊强引用、软引用、弱引用、虚引用前,我们先聊一下什么是引用。
在jvm内存结构中我们有提到java虚拟机栈。虚拟机栈描述的是java方法执行的线程内存模型:每个方法被执行的时候,java虚拟机都会同步创建一个栈帧用于存放局部变量表、操作数栈、动态链接、方法出口等信息。其中局部变量表中存放了编译期可知的各种java虚拟机基本类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他于此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。
对象引用:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称该reference数据代表某块内存或某个对象的引用。如下代码:
Monkeymonkey=newMonkey("球球",5);
在虚拟机栈的本地变量里的就存在一个mokney对象的reference类型,这个refernce指向堆中的一块内存区域。
强引用(StronglyReference)
强引用是我们代码里普遍存在的引用。例如:Monkeymonkey=newMonkey("球球",5);虚拟机栈中reference类型和java堆中的实例数据之间的引用。无论在任何情况下,只要强引用关系还在,垃圾回收器永远不会回收掉被引用的对象。
软引用(SoftReference)
软引用的官方定义:
软引用SoftRReference官方文档
软引用用来描述一些还有用,但非必须的对象,常用来实现对内存敏感的缓存。在虚拟机抛出内存溢出异常前,会对软引用对象进行回收,如果回收后内存还不足,则再抛出内存溢出异常。
弱引用(WeakReference)
官方定义:
弱引用官方文档
弱引用用来描述你那些非必须的对象,虽然都是非必须的对象,但是它的强度比软引用要更若一些。被弱引用关联的对象只能生存到下次垃圾收集发生位置。当垃圾收集器开始工作,无乱当前内存是否充足,都会回收掉被弱引用关联的对象。ThreadLocal中的ThreadLocalMap就使用了WeakReference
虚引用(PhantomReference)
虚引用是最弱的一种引用。为一个对象设置虚引用的唯一目的就是为了能在这个对象被收集器回收时收到一个系统通知。
关于这几个引用的程序举例,下次文章再详细说