1. 强引用 StrongReference
就是我们最普遍使用的方式,如
Object obj = new Object();
这样对于我们,就是创建一个强引用,只要引用存在,jvm就不会回收引用对应的空间,哪怕是报出内存空间不足的异常
当我们确定不需要使用obj对象时,可以
将obj置为null,这样jvm就认为它将不再使用,可以回收,但具体回收的时机还要看gc策略
2. 软引用 SoftReference
内存空间不足时,进行垃圾回收,如果内存空间足时,不会发生回收。
软引用一般和引用队列结合使用,当对象回收时,会加入到关联的引用队列中
public class SoftReferenceTest {
public static void main(String[] args) {
//原始强引用
String welcome = "hello world";
ReferenceQueue<String> refQueue = new ReferenceQueue<String>();
SoftReference<String> welcomeRef = new SoftReference<>(welcome,refQueue);
//置为空,这时可以垃圾回收
welcome = null;
//这时不一定回收,只有空间不足时,才会回收
System.gc();
//这时可能会引用到,也可能引用不到,就看是否空间不足,是否发生了回收
String welcomeValue = welcomeRef.get();
//如果垃圾回收了,则值不为空,如果还没有回收,则为空
Reference<? extends String> valueRef = refQueue.poll();
}
}
3. 弱引用 WeakReference
与软引用相似,区别就是发生垃圾回收时,就会将弱引用对象进行回收,而不用考虑空间是否够用。
4. 虚引用 PhantomReference
与前面引用不同, 虚引用的对象,在任何时间都可能被垃圾回收,它必须和引用队列联合使用,
当我们回收对象时,发现它还有虚引用,就会在内存回收前,将虛引用增加到引用队列中,
这时我们可以通过判断引用队列中,是否有相应的虚引用,然后在对象回收之前采取必须的措施。
网友评论