java引用:强软弱虚
public static void main(String[] args) throws IOException {
/**
* 强引用:默认的引用。只要有引用指向这个对象,垃圾回收一定不会回收他
*/
User user = new User();
//使user不在指向他,此时调用垃圾回收System.gc();可以回他
user = null;
System.gc();
System.in.read();
/**
* 软引用:当一个对象u被一个软引用指向的时候,只有系统内存不够用时,才会回收他
*/
SoftReference<User> user2 = new SoftReference<>(new User());
/**
* 弱引用:只要遇到垃圾回收,一定会被回收(多使用在容器里)
* 当一个强引用也指向这个对象的时候,如果强引用消失,那么这个弱引用也将自动消失
*/
WeakReference<User> user3 = new WeakReference<>(new User());
/**
* ThreadLocal的set的时候,就是往当前线程的ThreadLocalMap里添加
* key就是ThreadLocal本身,value就是set的值
* 这里的key就是通过弱引用指向的ThreadLocal对象
*
* 如果threadLocal这个强引用不在指向ThreadLocal,那么ThreadLocalMap中
* 的key这个弱引用指向的ThreadLocal的关系也将消失(防止内存泄漏)
*
* 如果这个key不是弱引用,则key的引用关系将一直存在,ThreadLocal对象不会被回收(内存泄漏)
*
* !!!!!!!!!!!!!!!!!!!!!!!!
* 即使ThreadLocal对象被回收,但还是有内存泄漏的存在。
* 因为此时key变为null,导致所有value再也无法被访问到。
* 所以,使用ThreadLocal时,里面对象不用时,务必threadLocal.remove()
*/
ThreadLocal<User> threadLocal = new ThreadLocal<>();
threadLocal.set(new User());
threadLocal.remove();
/**
* 虚引用:当对象被回收时,通过Queue可以检测到,然后清理堆外内存
*/
ReferenceQueue<User> queue = new ReferenceQueue<>();
PhantomReference<User> phantomReference = new PhantomReference<>(new User(),queue);
}