回覆列表
-
1 # 軟體改變生活
-
2 # 小魚兒的夢囈
判斷物件是否死亡是Java虛擬機器的工作,使用的是可達性分析演算法進行判斷的,當物件被判斷為死亡時,很快就會被GC清理回收。
根搜尋演算法(GC Roots),Java實際上使用的是GC Roots演算法。在Java語言裡,可作為GCRoots的物件包括下面幾種:
虛擬機器棧(棧幀中的本地變量表)中的引用的物件
方法區中的靜態屬性引用的物件
方法區中的常量引用的物件
本地方法棧中JNI(一般說的Native方法)的引用的物件
那麼怎麼判斷一個“無用的類”呢?,需要同時滿足下面三個條件才能算是“無用的類”
該類所有的例項都已經被回收,也就是Java堆中不存在該類的任何例項。
載入該類的ClassLoader已經被回收
該類對應的java.lang.Class物件沒有任何地方被引用,無法再任何地方透過放射訪問該類的方法
-
3 # 程式設計藝術思維
其實這裡有兩種演算法實現:引用計數器法和可達性演算法。
引用計數器法:
給物件新增一個引用計數器,每當有一個地方引用它時,計數器就加1;當引用失效時,計數器就減1;任何時刻計數器為0的物件就是不在被使用的。
優點: 實現簡單,判定效率高,在大部分情況下都是一個不錯的演算法。
缺點: 無法解決物件迴圈引用的問題。
可達性演算法:
這個演算法的思想是透過一系列的”GC roots“ 的物件作為根節點,從這些節點開始向下搜尋,搜尋走過的路徑稱為”引用鏈“,當一個物件到GC Roots沒有任何一個引用鏈相連,則證明這個物件是不可用的。
JAVA有自己的垃圾回收機制,具體題主可以到各大論壇檢視,很多高手前輩都有詳細說明。
具體判斷是否物件是否被回收,用常規判斷null是不能判斷的。
祝學習順利。