java垃圾回收機制(摘自瘋狂JAVA講義以及一位博主的分享)
java語言不需要程式設計師直接控制記憶體回收。Java的記憶體分配和回收都是由jre在後臺自動進行。jre會負責回收那些不在使用的記憶體。這種機制被稱為垃圾回收。(Garbage Collection GC)。 通常jre會提供一個後臺執行緒來進行監測和控制,一般都市在cpu空閒或記憶體不足時自動進行垃圾回收,而程式設計師無法精準的控制垃圾回收的時間和順序。
Java的堆記憶體是一個執行時資料區,用以保護類的例項(物件),Java虛擬機器的堆記憶體中 儲存著正在執行的程式建立的所有物件,這些物件不需要程式通過程式碼來顯示的釋放。一般來說,堆記憶體的回收有垃圾回收來負責。所有的jvm實現都有一個由垃圾回收管理的堆記憶體。
垃圾回收是一種動態儲存管理技術,他自動釋放不再被程式引用的物件,按照特定的垃圾回收演算法來實現記憶體資源的自動回收功能。
在Java中,當沒有引用變數指向原先分配給某個物件的記憶體時,該記憶體便成為垃圾。JVM的一個超級執行緒會自動釋放該記憶體區。垃圾回收意味著程式不在需要的物件時“垃圾資訊”,這些資訊將被丟棄。
垃圾回收能自動釋放記憶體空間,減輕程式設計的負擔。
優點:
1.可以提高程式設計效率。2.保護程式的完整性
回收不在使用的物件,我們可以將該物件的引用變數設定為null,通過這種方式按時垃圾回收機制可以回收該物件。程式設計師可以通過Runtime物件的gc() 或System.gc()等方法來建議系統進行垃圾回收。但是並不能精確控制垃圾回收機制的執行。
垃圾回收的精確性主要包括兩個方面:
1.垃圾回收機制能夠精確的標記活著的物件。(完全回收所有廢棄對像的前提,否則就可能記憶體洩漏)
2.垃圾回收器能夠精確地定位物件之間的引用關係。(實現歸併和複製等演算法的必要條件,通過這種引用關係,可以保證所有物件被可靠的回收,所有物件都能被重新分配,從而有效的減少記憶體碎片的產生。)
寫Java程式時,一個基本原則時:對於不再需要的物件,不要引用它們。如果保持對這些物件的引用,垃圾回收機制暫時不會回收該物件,則會導致系統記憶體越來越少;當系統可用記憶體越來越少時,垃圾回收的頻率就會越來越高,從而導致系統的效能下降。
垃圾回收機制:
序列垃圾回收器(為單執行緒環境設計,通過用一個單執行緒進行垃圾回收,它會凍結其他該應用程式執行緒進行工作,所以它不適合伺服器環境,他適合最簡單的命令列程式。 通過配置引數:-XX:+UseSerialGC可以使用該回收器)
並行垃圾回收器(JVM預設的垃圾回收器,與序列不同的是它是使用多執行緒垃圾回收。與序列相似的是,它會凍結其他該應用程式執行緒進行垃圾回收。-XX:+UseParallelGC)
並行標記/清除垃圾回收去器。簡稱GMS(併發標記垃圾回收使用多執行緒掃描記憶體,標記需要清理的例項,並且清除被標記過的例項。併發標記垃圾回收器只會在下面倆種情況下持有該程式的所有執行緒: 1。當標記的引用物件在tenured區域 2.在進行垃圾回收的時候,對記憶體的資料被併發改變。相比於並行垃圾回收器,併發標記掃描垃圾回收器使用更多的CPU來確保程式的吞吐量,如果為了更好的程式效能需要分配更多的CPU。可以通過-XX:UseParNewGC進行配置)
G1垃圾回收器。(G1回收器用於堆記憶體很大的情況下,它將記憶體分割成不同的區域。並且併發的對其進行垃圾回收,回收之後可以對剩餘的對記憶體空間進行壓縮。G1回收器會優先選擇第一塊垃圾最多的區域 ,通過-XX:UseG1GC使用G1垃圾回收器)