1,引用計數法
每個對象建立的時候會配置設定一個引用計數器,當這個對象被引用的時候計數器的值就會+1。任何時候,當引用計數器值為0的時候就說明這個對象不被使用了,需要被GC回收掉。
優點:算法簡單。
缺點:不能解決循環引用的問題,有垃圾對象不能被正确識别。
2,根搜尋法
一,以特定的對象作為基礎原始對象(也被稱為根),通過遞歸的方式不斷向下搜尋,從跟對象到達某個對象的路徑被稱為引用鍊。如果一個對象和跟對象之間存在引用鍊,那麼這個對象則是存活狀态,不能被回收。反之,如果一個對象與根對象之間不存在引用鍊,那麼這個對象是不可達的,那這個對象就是可回收的垃圾對象。此種算法是GC目前使用的搜尋算法。
優點:可找到所有垃圾對象,并解決了循環引用的情況。
缺點:需要周遊所有對象,而且遞歸算法難免會導緻效率不高。
二,那麼都有那些對象可以被稱為特定對象呢?
I,JAVA虛拟機棧中的引用對象。
II,方法區中的類靜态屬性引用的對象。
III,方法區中的常量引用的對象。
IV,本地方法棧中JNI引用的對象。
三,根算法中不可達對象在回收之前,要進行二次标記,第一次标記的時候會進行篩選,篩選是否有必要執行finalize()方法。有以下兩種情況不需要執行finalize方法:
I,目前對象類中沒有覆寫finalize方法。
II,finalize在前一次GC時已經調用過一次finalize方法了。
如果這個對象有必要執行,則會放在一個隊列中,以一個低優先級的線程執行finalize方法進行二次标記,如果在finalize中,對象與根能夠建立引用鍊,那麼該對象不會被回收。
、