原理:給一個對象添加一個引用計數器,每當一個地方引用它時,計數器就加1;當引用失效時,計數器就減1;任什麼時候刻計數器爲0的對象就是不可再被使用的;java
優勢:效率高;spa
缺點:很難解決對象間的循環引用;對象
原理:經過一系列稱爲「GC Roots」的對象做爲起點向下開始搜索,搜索走過的路徑稱爲引用鏈,當一個對象到「GC Roots」沒有任何引用鏈時(不可達),則該對象是不可用的;內存
可做爲「GC Roots」的對象:一、虛擬機棧中引用的對象;二、方法區中「靜態屬性、常量」引用的對象;三、本地方法中引用的對象;虛擬機
強引用效率
軟引用:對於軟引用關聯的對象,在系統將要發生內存溢出異常以前,將會把這些對象列進回收範圍之中進行第二次回收,若是第二次回收後尚未足夠內存,纔會拋出內存溢出異常;原理
弱引用:弱引用關聯的對象,只能生存到下一次垃圾收集發生以前。下一次垃圾收集器工做時,不管當前內存是否足夠,都會回收掉只被弱引用關聯的對象;搜索
虛引用:沒有其餘影響;爲一個對象設置虛引用關聯的惟一目的就是能在這個對象被收集器回收時收到一個系統通知。循環
第一次標記:是否與「GC Root相連」以及是否有必要執行finalize方法;引用
第二次標記:在F-Queue中;
注意:對象的finalize方法只能被調用一次,能夠在finalize方法中實現對象自救;
方法區主要的垃圾:廢棄常量和無用的類;
描述無用的類須要同時知足這三個條件:一、該類全部實例已經被回收(堆中無該類的實例);二、加載該類的ClassLoader已經被回收;三、該類的java.lang.Class對象都沒有在任何地方被引用,沒法在任何地方經過反射訪問該類的方法;