1、jvm怎麼判斷哪些對象應該回收呢回答:引用計數演算法和可達性分析演算法 因為引用計數法的演算法是這樣的:在對象中添加一個引用計數器,每當一個地方引用它時,計數器就加一;當引用失效時,計數器值就減一;任何時刻計數器為零的對象就是不可能再被使用的。 但是這樣的演算法有個問題,是什麼呢? Object 1和O ...
1、jvm怎麼判斷哪些對象應該回收呢
回答:引用計數演算法和可達性分析演算法
因為引用計數法的演算法是這樣的:在對象中添加一個引用計數器,每當一個地方引用它時,計數器就加一;當引用失效時,計數器值就減一;任何時刻計數器為零的對象就是不可能再被使用的。
但是這樣的演算法有個問題,是什麼呢?
就是不能解決迴圈依賴的問題。看下圖解釋:
Object 1和Object 2其實都可以被回收,但是它們之間還有相互引用,所以它們各自的計數器為1,則還是不會被回收。
所以,Java虛擬機沒有採用引用計數法。它採用的是可達性分析演算法。
可達性分析演算法的思路就是通過一系列的“GC Roots”,也就是根對象作為起始節點集合,從根節點開始,根據引用關係向下搜索,搜索過程所走過的路徑稱為引用鏈,如果某個對象到GC Roots間沒有任何引用鏈相連。
用圖論的話來說就是從GC Roots到這個對象不可達時,則證明此對象是不可能再被使用的。所以此對象就是可以被回收的對象。
你剛剛談到了根節點,那你知道哪些對象可以作為根對象嗎?
你剛剛談到了引用,那你知道java裡面有哪幾種引用嗎?
你剛剛談到了可達性分析演算法,那如果在該演算法中被判定不可達對象,是不是一定會被回收呢?
談談你熟悉的垃圾回收器和他們的工作過程?