前言: 再高的山峰也有跨过的时候,再遥远的路,终有一天也会抵达终点 ----- 送给正在拼搏的所有人
何为弱引用
我们知道java中一切皆对象,而这个对象可以称之为引用,它指向了堆内存的一块地址,在说弱引用之前,先说一下强引用:强引用就是我们平时new出来的普通对象,比如Person p = new Person()
,p对象一般来说可以称之为强引用,强引用有什么特点呢?
- 指向了堆内存的一块地址
- 如果GC ROOT根可达,且引用链皆为强引用,则不会被垃圾回收
这些概念相信大家都耳熟能详,下面再介绍弱引用
所谓弱引用,是用来描述那些非必须的对象,被弱引用关联的对象(此对象只被弱引用,没有被强引用)只能生存到下一次垃圾收集发生为止,不管当前内存是否充足,都会回收掉只被弱引用关联的对象,在jdk1.2之后提供了WeakReference类来实现弱引用。
那么我们可以总结一下它的特点
- 指向了堆内存的一块地址
- 如果只被弱引用关联,则下次垃圾回收一定会回收此对象
具体示例
package com.chuquwan.mbean;
import java.lang.ref.WeakReference;
public class WeakTest {
public static void main(String[] args) {
// 1.创建person对象,此引用类型为强引用
Person person = new Person();
// 2.创建弱引用对象,表示初始化一个person的弱引用
WeakReference<Person> weakReference = new WeakReference<>(person);
// 3.查看此弱引用对象还是否存在
System.out.println(weakReference.get());
// 4.将强引用赋值为null,此时person只存在了一个弱引用
person = null;
// 5.提醒jvm开始垃圾收集
System.gc();
// 6.再此检查垃圾收集后的弱引用是否还存在,此时应该已经为null了
System.out.println(weakReference.get());
}
}
class Person {}
输出结果
com.chuquwan.mbean.Person@330bedb4
null
弱引用有啥用
前面说了一大堆,总结出了若干个问题,其中包括
- 什么对象是非必须的?
- 弱引用的作用是什么?
- 能不能举个具体的应用场景?
什么对象是非必须的?
这个很难回答,需求不同,答案就不同。一般来说,我认为是一次性的使用对象,当他使用完毕之后,他就毫无用处了,此对象可以称之为非必须的
弱引用的作用
是用来管理并回收这些非必须的对象
具体应用场景
WeakReference在ThreadLocal类中有具体应用,我们下次会在ThreadLocal的内存泄露问题进行讨论
部分参考自: 《深入理解Java虚拟机》
本人才疏学浅,如有错误,还请指正,如需转载,还请注明出处 :)