引用
什么是引用
在java中一切都被视为对象,我们的操作的标识符就是对对象的引用,类似一个指针,指向元素的地址
通过引用了可以操作对象
引用的四种类型
那么java中有4种引用,
强引用,软引用,弱引用,虚引用
强引用
我们常用的引用就是强引用。这是java默认声明的应用;
String a = "abc"
那么强引用是什么意思呢,就是只要a指向"abc",GC永远不会回收该对象。不然内存是否溢出。
此时可以通过a=null
,手动置空来清除指向,GC回收"abc"对象
软引用
软引用是指 非必须但是有用的对象,也就是说,
如果内存足够,那么GC就不回收软引用对象,因为它有用,内存不够了,那么GC就回收软引用对象,因为它其实并不是必须的。
java当中怎么使用呢?
使用
java.lang.ref.SoftReference
类来表示软引用这里通过JVM命令限定了内存
-Xms2M -Xmx3M
初始内存2,最大3
private static List<Object> list = new ArrayList<>();
public static void main(String[] args) {
testSoftReference();
}
private static void testSoftReference() {
for (int i = 0; i < 10; i++) {
byte[] buff = new byte[1024 * 1024];
SoftReference<byte[]> sr = new SoftReference<>(buff);
list.add(sr);
}
//垃圾回收
System.gc();
for(int i=0; i < list.size(); i++){
Object obj = ((SoftReference) list.get(i)).get();
System.out.println(obj);
}
}
结果:
null
null
null
null
null
null
null
null
null
[B@49e4cb85
Process finished with exit code 0
系统内存不足的时候触发回收,所以前9个个对象直接被回收了,置null
弱引用
只有弱引用的对象,当JVM触发gc时,就会回收该对象。与软引用不同的是,不管是否内存不足,弱引用都会被回收。
java.lang.ref.WeakReference
来表示弱引用。
private static void testWeakReference() {
for (int i = 0; i < 10; i++) {
byte[] buff = new byte[1024 * 1024];
WeakReference<byte[]> sr = new WeakReference<>(buff);
list.add(sr);
}
System.gc(); //主动通知垃圾回收
for(int i=0; i < list.size(); i++){
Object obj = ((WeakReference) list.get(i)).get();
System.out.println(obj);
}
}
结果:
null
null
null
null
null
null
null
null
null
null
测试后发现不论内存够不够,只要触发了gc
就全部回收
虚引用
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收
虚引用主要用来跟踪对象被垃圾回收器回收的活动,当被回收时,JVM会把这个弱引用加入到与之相关联的ReferenceQueue
中。
与软引用和弱引用不同的是,虚引用必须有一个与之关联的ReferenceQueue
虚引用的主要作用是跟踪对象垃圾回收的状态
。仅仅是提供了一种确保对象被finalize
以后,做某些事情的机制
//源码
public T get() {
return null;
}
public PhantomReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
}
引用队列
引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。
各种引用的应用场景
- 软引用与弱引用
- 保存那些可有可无的缓存数据,当内存不足时,缓存数据被回收(再通过备选方案查询),当内存充足时,也可以存在较长时间,起到加速的作用。如
weakHashMap
- 保存那些可有可无的缓存数据,当内存不足时,缓存数据被回收(再通过备选方案查询),当内存充足时,也可以存在较长时间,起到加速的作用。如
- 虚引用
- 虚引用主要用来跟踪对象的回收,清理被销毁对象的相关资源