對象是否可回收的方法有哪些?
gc是JAVA語言魅力之所在,也是面試過程中常常提及的點,下面分析下jvm怎么回收垃圾!
1,被動回收:首先需要明確的是,jvm有一套自動回收垃圾的機制,jvm中的線程在掃描的時候如果發現有不可達對象,就進行標記,表示這個對象占用的內存可以回收(這個時候還沒回收)。
這里的重點是什么是不可達對象?jvm會選擇一個不會被回收的變量(static final),或者本地方法棧中的對象,或者靜態(static)的對象作為GC ROOTS(根節點),其他所有創建的對象引用都會掛在這個根節點上,變成一顆類似樹的結構。
在回收垃圾的時候,從根節點開始遍歷,如果發現有對象引用遍歷不到,也就是沒掛在根節點上,比如A引用B,B引用C,但是A掛在樹上的引用被剪斷,那么ABC對象就屬于不可達對象,也就是需要回收的對象!
回收線程再次掃描的時候發現之前被搭上標記的對象,并調用類中默認繼承的finalize方法,該方法會檢測是否有引用繼續指向待回收對象,如有引用,則這些對象重新使用不在回收,如果確定回收的對象,會放入一個專門回收的隊列中,由專門的線程進行清空內存!
2,主動回收:調用system.gc方法進行對象回收,但是正如上面所說,調用了之后,只是打上可回收標記,真正的釋放內存還需要jvm自己來進行!
JAVA是個無底洞,如果您有問題,歡迎來交流,更多的技術分享,敬請關注。。
上一篇map擴容為什么是2倍
下一篇我是歌手的評委都有誰