概述
JVM很重要。尤其是GC算法。
程序計數器、虛擬機棧、本地方法棧。這幾個區域完全不用管回收問題,因為方法結束或者線程結束的時候他們所占用的內存就自然跟着一起釋放了,3個區域隨線程而生,隨線程而滅。所以我們只需要管堆和方法區。尤其是堆,因為一個接口中的多個實現類需要的內存可能不一樣,一個方法中的多個分支需要的內存也可能不一樣,這部分內存的分配和垃圾回收都是動態的。
引用計數法(ReferenceCounting)
1、算法
給對象中添加一個引用計數器,每當有一個地方引用他時,計數器值就+1,;當引用失效時,計數器值就-1;任何時刻計數器為0的對象就是不可能在被使用。
2、圖解

3、優缺點
(1)、優點
判定效率很高
(2)、缺點
不會完全准確,因為如果出現兩個對象相互引用的問題就不行了。如下代碼所示:

(4)、分析上述代碼

很明顯,到最后兩個實例都不再用了(都等於null了),但是GC卻無法回收,因為引用數不是0,而是1,這就造成了內存泄漏。也很明顯,現在虛擬機都不采用此方式。
可達性分析算法(Reachability Analysis)
通過一系列的GC Roots的對象作為起始點,從這些根節點開始向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。

說明:
(2.1)、紅色代表不可達對象(可回收對象)
(2.2)、千萬注意!!!!!上圖並不是說方法區全可達,虛擬機棧部分可達,本地方法棧全部不可達,而只是為了說明這三個部分可以作為GC Roots!
3、可以作為GC Roots的對象包括以下幾點
(3.1)、虛擬機棧(棧幀中的本地變量表)中引用的對象。
(3.2)、方法區中的類靜態屬性引用的對象或者常量引用的對象。
(3.3)、本地方法棧中JNI(就是native方法)引用的對象。