垃圾收集器:java
引用計數算法:給對象中添加一個引用計數器,每當有一個地方引用時。計數器值就增長1;當引用失效時,計數器值就減1;任什麼時候刻計數器爲0的對象就是不可能再被使用的。算法
注:很難解決java問題中的對象之間的相互循環引用問題。線程
根搜索算法: 經過一系列的名爲「」GC Roots」的對象爲起始點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈,當一個對象到GC Roots 沒有任何的引用鏈相連時,對象
則證實此對象是不可用的。內存
注:GC Roots對象分爲:(1)虛擬機棧(棧幀中的本地變量表)中的引用的對象。虛擬機
(2)方法區中的靜態屬性引用的對象。效率
(3)方法區中常量引用的對象。基礎
(4)本地方法棧中JNI(native方法)的引用的對象。變量
引用:引用數據類型的值存儲的是一塊內存的起始地址,則表明着一種引用。搜索
Java中將引用分爲:強引用、軟引用、弱引用、虛引用。
強引用:只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象。
軟引用:系統將要發生內存溢出異常以前,將會把這些對象列進回收範圍之中並進行第二次回收。
弱引用:被弱引用關聯的對象只能生存到下一次垃圾收集器發生以前。
虛引用:一個對象是否有虛引用的存在,徹底不影響其生存時間,也沒法經過虛引用來取得一個對象實例。
方法區回收(永久代回收):廢棄常量和無用的類。
廢棄常量:當前系統沒有任何地方引用這個常量,若是發生內存回收,有必要的話,會被系統清除常量池。
無用的類:(1)該類全部的實例都已經被回收,Java堆中不存在該類的任何實例。
(2)加載該類的ClassLoader已經被回收。
(3)該類的Java.lang.Class對象沒有在任何地方被引用,沒法經過反射訪問該類的方法。
垃圾收集算法: (1)標記-清除算法(最基礎):分爲標記和清除兩個階段,首先是標記出全部須要回收的對象,在標記完成後,統一回收掉全部被標記的對象。
缺點:(1)效率不高;
(2)空間問題:標記清除後,會產生大量不連續的內存碎片,可能會致使之後的程序須要分配較大對象時,沒法找到足夠的連續內存,
而觸發垃圾收集動做。
(2)複製算法:它將可用內存按容量分爲了大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完後,就將還存活着的對象複製到另外一塊上去,
而後再把已使用的內存空間一次清理掉。
(3)標記-整理算法:標記過程與標記-清除算法中的標記同樣,而後讓全部存活對象都向一端移動,最後直接清理端邊界之外的內存。
(4)分代收集算法:當代商業虛擬機都採用 「分代收集」 算法,根據對象的存活週期的不一樣將內存劃分爲幾塊。將java堆分爲新生代和老年代,而後就能夠根據各個年代
的特色採用最適當的收集算法。
在新生代中,有大批的對象死亡,只有少數存活,採用複製算法;
在老年代中,對象存活率較高,故採用標記-清除或標記-整理算法。
垃圾收集器分類:
Serial收集器 :在JDK1.3以前是虛擬機新生代收集的惟一選擇,這個收集器是最基礎的、最悠久的收集器,這個收集器是單線程收集器。
Serial垃圾收集器在進行垃圾收集時,必須暫停其餘全部的工做線程,直到它收集結束。