数据类型
除了原始数据类型的变量,其他所有都是所谓的引用类型。
不同的引用类型,主要体现的是对象不同的可达性状态和对垃圾收集的影响(其实就是GCRoot中的可达性分析)
我们在创建各种引用并关联到响应对象时,可以选择是否需要关联引用队列。如果引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
强引用类型
即常见的普通对象,有引用指向对象,对象即还活着,不会被GC当做垃圾,即使OOM了也不会把强引用视为垃圾。但,一旦引用超出作用域或显示=null,则允许被GC当做垃圾,因为他已经不是强引用了…
软引用类型
只有当JVM内存不足的时候,GC才会把这种类型的数据当做垃圾。常和引用队列联合使用。它常被应用于缓存类场景。比如:头像图片,软引用保存在内存中,OOM了就回收掉。
SoftReference<String> sr = new SoftReference<String>(new String("hello"));
弱引用类型
GC当它是垃圾。常和引用队列联合使用。
WeakReference<String> sr = new WeakReference<String>(new String("hello"));
幻象引用类型
不能通过他访问数据,它是对象finalize的之后,剩下的。
访问他得到的永远是null。它必须和引用队列 (ReferenceQueue)联合使用。
Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue<>(); PhantomReference<Object> p = new PhantomReference<>(counter, refQueue);
counter = null; //这两句是为了使其被GC视为垃圾,然后执行垃圾清理
Sysem.gc();
try {
// Remove是一个阻塞方法,可以指定timeout,或者选择一直阻塞
Reference<Object> ref = refQueue.remove(1000L);
if (ref != null) {
// do something
}
} catch (InterruptedException e) {
// Handle it
}
注意:以上所说的只是被GC当做垃圾,而不是触发GC,不是一回事儿。