Java 中除了強引用之外,還提供了其它低級別的引用

對象可達(dá)狀態(tài):
在強引用之外,弱引用可以泛化成多種不同強度的弱指針。 ? ??
以引用強度為順序的回收可以為每種強度級別關(guān)聯(lián)一個正整數(shù)。對于給定的整數(shù) a>0,
如果從根出發(fā)存在一條指針鏈可以到達(dá)某一對象,且該指針鏈重點的所有指針強度均不小于a,則稱該對象為a可達(dá)
強可達(dá):必然有一條是強引用
軟可達(dá):通過軟引用實現(xiàn),不保證gc回收時置空,jvm保證 OutOfMemery之前回收
弱可達(dá):通過弱引用實現(xiàn),gc下次時置空弱引用,回收
虛可達(dá):無法通過get()方法獲取到引用的對象,gc不負(fù)責(zé)引用置空,需手動實現(xiàn)
????????? 特殊:如果對象中實現(xiàn)了finalize()方法,jvm會為該對象創(chuàng)建FinalReference引用,一般用于保底操作(回收資源等),建議手動提前回收資源。
?當(dāng)gc掃描時,發(fā)現(xiàn)相應(yīng)的引用時,把引用放入鏈表中
①jvm把引用放到discovered或者pending

② 判斷對象無強引用時,如果判斷該對象需要回收,把相應(yīng)引用置空,對象成不可達(dá)狀態(tài),
把discoved中引用放入pending鏈表中
③ Reference中線程Reference Handler處理pending鏈表,
3.1 如果是Cleaner(PhantomReference子類),直接調(diào)用clean()方法
3.2 把引用放入到自己的ReferenceQueue中。




4? 不同級別的引用對自己的隊列做不同處理
? 4.1? Finalizer(FinalReference) 調(diào)用Finalizer()方法,并且調(diào)用super.clear()置空引用



4.2 SoftReference 手動實現(xiàn)置空
4.3 weakReference 手動實現(xiàn)置空