引用計數法
引用計數法是一種垃圾回收(Garbage Collection)算法,用于自動管理內存中的對象。在引用計數法中,每個對象都有一個關聯的引用計數器,用于記錄對該對象的引用數量。
當一個新的引用指向對象時,該對象的引用計數器加1;當一個引用不再指向對象時,對象的引用計數器減1。當引用計數器的值為0時,說明該對象沒有被引用,即可被認定為垃圾對象,可以被垃圾回收器回收內存。
引用計數法的優點是實時性強,一旦沒有引用指向對象,就可以立即釋放內存。
缺點:
不能解決循環依賴
循環依賴:兩個對象相互依賴,這樣計數器就不會清零
?可達性分析算法
Java 虛擬機中的垃圾回收器采用可達性分析來探索所有存活的對象
可達性分析算法的基本思想是從一組稱為"根"的起始對象開始,遞歸地遍歷對象引用鏈,標記所有被訪問到的對象為存活對象,而未被標記的對象則被認定為垃圾對象,可以被垃圾回收器回收內存。
在JVM中,根對象通常包括以下幾種:
- 本地變量表中引用的對象:包括當前執行的方法中使用的對象引用。
- 靜態變量中引用的對象:即類的靜態字段所引用的對象。
- 活動線程中的對象:即正在執行的線程中的對象。
- JVM內部的引用:例如常量池中的引用、類靜態引用等。
通過從根對象開始,可達性分析算法會遍歷對象的引用鏈,找到所有可達對象。未被訪問到的對象則被認定為垃圾對象。
可達性分析算法的優點是能夠準確地判斷對象是否存活,避免了引用計數法中循環引用的問題。然而,可達性分析算法的缺點是需要進行全局掃描,可能會造成一定的性能開銷。