强引用
常见的对象赋值引用,不为空,则不会被垃圾回收器回收直到内存溢出
demo
ini
/**
* 强引用
*/
@Test
public void dd(){
Object o = new Object();
System.gc();
assert o != null;
o = null;
assert o == null;
}
GC可达性检测

软引用
次于强引用,但比强引用更弱,不会被垃圾回收器回收,但内存溢出时,会被回收
适合缓存,比如图片缓存,文件缓存,数据库连接缓存,缓存数据,图片等
typescript
/**
* 软引用
*/
@Test
public void dd1(){
SoftReference<Object> o = new SoftReference(new Object());
assert o != null;
}
弱引用
弱引用,比软引用更弱只能生存到下一次垃圾收集发生之前
ThreadLocalMap 源码结构
scala
static class ThreadLocalMap {
/**
* The entries in this hash map extend WeakReference, using
* its main ref field as the key (which is always a
* ThreadLocal object). Note that null keys (i.e. entry.get()
* == null) mean that the key is no longer referenced, so the
* entry can be expunged from table. Such entries are referred to
* as "stale entries" in the code that follows.
*/
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
/**
* 弱引用
*/
@Test
public void dd2(){
WeakReference<Object> o = new WeakReference(new Object());
assert o != null;
}
虚引用
资源回收回调
typescript
/**
* 虚引用
*/
@Test
public void dd3(){
// 创建一个引用队列
ReferenceQueue<Object> queue = new ReferenceQueue<>();
}