JAVA不可不知的强软弱虚四种引用
2021-02-10 13:16
标签:unlock nsa 16px sys dex protected zhang omr 24* 一个变量指向new对象,就是引用,在java中有四种引用,分别是强软弱虚,常见的Object o = new Object(),就是强引用,垃圾回收的时候,强引用不会被回收。 例子图示: JAVA不可不知的强软弱虚四种引用 标签:unlock nsa 16px sys dex protected zhang omr 24* 原文地址:https://www.cnblogs.com/Courage129/p/12734506.html
public class M {
@Override
protected void finalize() throws Throwable {
System.out.println("finalize");
}
}
public class T01_NormalReference {
public static void main(String[] args) throws IOException {
M m = new M();
m = null;//只有没有引用时,M的对象m才会被回收
System.gc(); //DisableExplicitGC
System.in.read();//阻塞线程的目的是:因为GC是运行在其他线程中的,不阻塞很可能还没开始回收,线程就已经结束了。
}
}
代码:先设置VM options :-Xms20M -Xmx20M(设置堆内存最大最小都是20M)
public class T02_SoftReference {
public static void main(String[] args) {
SoftReferencebyte[]> m = new SoftReference(new byte[1024*1024*10]);
//m = null;
System.out.println(m.get());
System.gc();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(m.get());
//再分配一个数组,heap将装不下,这时候系统会垃圾回收,先回收一次,如果不够,会把软引用干掉,此时打印的结果应该是空置
byte[] b = new byte[1024*1024*15];
System.out.println(m.get());
}
}
代码:
public class T03_WeakReference {
public static void main(String[] args) {
WeakReference
public class ThreadLocal2 {
static ThreadLocal
1、堆外内存。
NIO里面有一个Buffer,叫DirectByteBuffer(直接内存,不被jvm虚拟机管理),也叫堆外内存,被操作系统管理,如果这个引用被置为空值,则没法回收,用虚引用
时,检测Queue,如果被回收了则去清理堆外内存。java回收堆外内存用的是Unsave中的freeMemory
2、会关联一个队列,当虚引用被回收的时候回接收到关联队列里,也就是给你一个通知,被回收了,弱引用里面的值是可以get到的,虚引用根本get不到
3、垃圾回收器一过来,直接就被回收了public class T04_PhantomReference {
private static final List