1、什么是垃圾回收
垃圾回收是JVM線程回收無用的對象占據的內存空間。
2、怎么發現無用對象
a、 引用計數法
使用計數器區分存活對象和無用對象,堆中的每個對象對應一個計數器,創建一個對象賦值給一個變量時,計數器加1,每次對象賦值給變量時,計數器加1,引用失效時,計數器減1 ,當計數器為0,對象為無用對象。
b、根集法
從根集開始確定可達和不可達對象,不可達對象即為無用對象。
根集包括 虛擬機棧中引用的對象 、方法區域中的類靜態屬性引用的對象、方法區域中常量引用的對象、本地方法棧中JNI(Native方法)引用的對象
3、垃圾收集算法
a、引用計數法
用2.a方法發現無用對象,收集。
實現簡單,不會長時間中斷程序,但是每次增加引用和引用失效都伴隨著一個加法和減法操作,影響系統性能,而且不能處理循環引用問題。
b、標記清除法
從根集開始,標記所有從根節點可達的對象,沒有標記的對象就是無用對象,然后,清除所有沒被標記的無用對象
產生內存碎片
c、復制算法
將內存空間分為兩塊,一次使用一塊,垃圾回收時,將正在使用的一塊的存活對象復制到另一空閑塊,清除正在使用的內存塊。
不會產生內存碎片,在垃圾對象很多的情況下效率比較高
jvm的新生代串行垃圾回收器中,使用復制算法,老生代存活對象比較多,復制成本比較大,不適合用此方法。
d、標記壓縮法
與標記清除法一樣,標記所有從根節點可達的對象,然后將所有存活的對象壓縮到內存的一段。
避免產生內存碎片,同時不需要兩塊內存塊。是一種老生代的回收算法。
e、分代算法
根據對象特點把內存分成幾塊,根據每塊內存空間存儲對象的特點,采用不同的回收算法
一般情況下,jvm把所有新建對象放入新生代內存區域,由于新手代特點是朝生夕滅,適合復制算法。一個對象經過幾次回收依然存活,會放入老生代。老生代對象存活率比較高,適合標記壓縮法。
新生代回收頻率高,耗時短,老生代回收頻率低,耗時長。
f、分區算法
把整個堆空間分為連續的小區間,每個區間獨立使用,獨立回收。根據目標停頓時間,合理回收若干個區間,減少一次GC的停頓
新聞熱點
疑難解答