在看java的ThreadLocal的源碼實現(xiàn)時,涉及到了弱引用,對于這種引用方式,并不太常用到,翻看各種博客文檔,將java的各種引用總結如下:
1.強引用
User user = new User();
· 1
在我們日常編碼中,使用最廣的引用方式。
只要強引用還存在,對象就不會被垃圾回收器回收。
可以通過將引用置空的方式,讓JVM回收該對象。
2.軟引用
SoftReference ref = new SoftReference(new User();
· 1
有用但是并非必須的對象可以使用弱引用。
對于軟引用關聯(lián)著的對象,只有在內存不足的時候JVM才會回收該對象。
因此,這一點可以很好地用來解決OOM的問題。
3.弱引用
WeakReference ref = new WeakReference(new User();
· 1
只具有弱引用的生命周期較軟引用更加短暫。
垃圾回收器線程掃描發(fā)現(xiàn)了只具有弱引用的對象,不管當前內存空間是否足夠,都會回收它的內存。
因此,弱引用更適合想緩存數(shù)據(jù),又不想影響對象收集的地方。ThreadLocal中的ThreadLocalMap采用的即是弱引用作為Key。
4.虛引用(幻影引用)
PhantomReference ref = new PhantomReference(new User(), referenceQueue);
· 1
顧名思義,該應用并不能獲取到任何對象,也不會影響對象生命周期。
虛引用必須和引用隊列聯(lián)合使用,虛引用主要用來跟蹤對象被垃圾回收的活動。