以下皆为个人理解,如有错误,请谅解
什么是引用
对象分配在堆中,当需要操作一个对象时,就必须得到对象的引用。通俗的说,就是使用一个变量指向某个对象,即获取某个对象的引用。
下图所示的就是一种引用。代码中表示为Object one = new Object();
代码中常见的赋值运算符
=
即表示获取了某个对象的引用。除此之外,还提供了其它三种引用,既然都是为了操作对象,那么为什么还要对引用分类呢?其实这些都是为了让JVM对对象更好的管理,方便GC
四种引用类型
强引用
默认的引用类型,当有一个变量指向对象时,此对象的引用便+1。被强引用的对象是不会被GC回收的,即使内存满了(这种情况也就是常说的OOM),直到此对象没有被任何变量引用时,就会在下次GC时回收。上述的情况是针对引用计数器法。但是无法解决两个对象循环引用(每个对象并没有被任何变量引用,但是对象之间存在引用关系)造成的内存泄漏问题,便有了可达性分析法。
除了强引用外的其它引用类型,必须显式的规定引用类型,也就是编码确定。
软引用
SoftReference
软引用对象,由垃圾收集器根据内存需求自行决定清除。即只有当内存不足时清除软引用对象。软引用最常用于实现缓存,即还有用但非必须的一些对象,适用于占用内存大、使用不频繁的对象。
弱引用
WeakReference
弱引用对象,在发生GC时就被回收,不管内存够不够用。ThreadLocal
中便使用了弱引用。弱引用主要用于监控对象是否已经被垃圾收集器标记为即将回收的垃圾。
虚引用
PhantomReference
虚引用对象,在发生GC时就被回收,主要用于检测对象是否已经从内存中删除。