上篇文章,咱們瞭解了GC 的相關概念,這篇文章咱們經過兩個算法來了解如何去肯定堆中的對象實例哪些是咱們須要去回收的垃圾對象。算法
引用計數法的原理很簡單,就是在對象中維護一個計數器,當有一個對象引用它的時候,該計數器的值就會加一,當這個引用失效的時候,計數器的值就會減小一,當計數器的值爲零的時候,就意味着這個對象是一個垃圾對象,須要被 GC 回收,這個算法是一個比較高效的算法,可是會存在一種對象循環引用致使內存泄露的問題,什麼是循環引用呢?3d
就像這樣,對象 A 和對象 B 之間存在相互引用,可是除此以外,這兩個對象再無引用,講道理,這兩個對象是屬於咱們定義的垃圾中的,可是因爲計數器的值不爲零,因此就沒法被標記爲垃圾,咱們的 GC 也就沒法去回收這兩個對象,這兩個對象會失去控制,長久的存在咱們的對象中佔用內存,形成內存的泄露。cdn
這個算法我通常理解爲落葉歸根算法(遠離家鄉 不甚唏噓 幻化成秋夜 而我卻像落葉歸根 墜在你心間~),爲何這麼說呢?這個算法的原理也很簡單,就是維護一系列的『GC ROOT』的對象做爲咱們的根,從這些根搜索,走過的路徑官方話叫作引用鏈(Reference Chain),當一個對象到根節點沒有任何引用,就意味着這個對象是不可用的,也就是咱們俗稱的垃圾~對象
換個說法來理解很簡單:長在樹上的葉子是咱們的可用對象,當葉子脫離了樹枝,與樹根之間沒有任何聯繫的時候,就須要落葉歸根,被 GC 回收,也就是落紅不是無情物,化做春泥更護花~blog
那麼在咱們的 JVM 中,能夠被認爲是 GC ROOTS的對象有如下幾種:內存