更新時(shí)間:2022-09-05 10:34:01 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3715次
本文檔將解釋什么是 java 中的垃圾收集器以及主要的垃圾收集器類型以及每個(gè)垃圾收集器的行為。
Java 是一種面向?qū)ο蟮木幊陶Z(yǔ)言,包括Automatic Garbage Collection。Java 會(huì)自動(dòng)分配和取消分配內(nèi)存,因此程序不會(huì)承擔(dān)該任務(wù)。現(xiàn)在(Java-12),Java 有七種類型的垃圾收集器。
這是最簡(jiǎn)單的 GC 實(shí)現(xiàn)。它基本上是為單線程環(huán)境設(shè)計(jì)的。此GC垃圾回收實(shí)現(xiàn)在運(yùn)行時(shí)凍結(jié)所有應(yīng)用程序線程。它使用單線程進(jìn)行垃圾收集。因此,在服務(wù)器環(huán)境等多線程應(yīng)用程序中使用它并不是一個(gè)好主意。
要啟用串行垃圾收集器,我們可以使用以下參數(shù):
java -XX:+UseSerialGC -jar Application.java
并行垃圾收集器也稱為吞吐量收集器。與串行垃圾收集器不同,它使用多個(gè)線程進(jìn)行垃圾收集。與串行垃圾收集器類似,這也會(huì)在執(zhí)行垃圾收集時(shí)凍結(jié)所有應(yīng)用程序線程。垃圾收集器最適合那些可以承受應(yīng)用程序暫停的應(yīng)用程序。
要啟用并行垃圾收集器,我們可以使用以下參數(shù):
java -XX:+UseParallelGC -jar Application.java
如果我們使用這個(gè)GC,我們可以指定最大垃圾收集線程和暫停時(shí)間、吞吐量和占用空間(堆大小)
可以使用命令行選項(xiàng)控制垃圾收集器線程的數(shù)量
-XX: ParallelGCThreads=<N>
使用命令行選項(xiàng)指定最大暫停時(shí)間目標(biāo)(兩次GC之間的間隔 [以毫秒為單位] )
-XX: MaxGCPauseMillis=<N>
最大吞吐量目標(biāo)(根據(jù)執(zhí)行垃圾收集所花費(fèi)的時(shí)間與在垃圾收集之外花費(fèi)的時(shí)間來(lái)衡量)由命令行選項(xiàng)指定
-XX:GCTimeRatio=<N>
使用選項(xiàng)-Xmx <N>指定最大堆占用空間(程序運(yùn)行時(shí)所需的堆內(nèi)存量)。
并發(fā)標(biāo)記掃描 (CMS) 垃圾收集器使用多個(gè)垃圾收集器線程進(jìn)行垃圾收集。它掃描堆內(nèi)存以標(biāo)記要驅(qū)逐的實(shí)例,然后掃描標(biāo)記的實(shí)例。它專為喜歡更短的垃圾收集暫停的應(yīng)用程序而設(shè)計(jì),并且可以在應(yīng)用程序運(yùn)行時(shí)與垃圾收集器共享處理器資源。
CMS 垃圾收集器僅在以下兩種情況下持有所有應(yīng)用程序線程
在標(biāo)記老年代空間中的引用對(duì)象期間。
堆內(nèi)存的任何變化與垃圾回收并行
與并行垃圾收集器相比,CMS 收集器使用更多的 CPU 來(lái)確保更好的應(yīng)用程序吞吐量。如果我們可以分配更多的 CPU 以獲得更好的性能,那么 CMS 垃圾收集器是優(yōu)于并行收集器的首選。
要啟用 CMS 垃圾收集器,我們可以使用以下參數(shù):
java -XX:+USeParNewGC -jar Application.java
G1(垃圾優(yōu)先)垃圾收集器專為在具有大內(nèi)存空間的多處理器機(jī)器上運(yùn)行的應(yīng)用程序而設(shè)計(jì)。它從JDK7 Update 4和更高版本開(kāi)始可用。
它將堆內(nèi)存分成多個(gè)區(qū)域,并在其中并行收集。G1 也會(huì)在回收內(nèi)存后立即壓縮空閑堆空間。但是 CMS 垃圾收集器會(huì)在停止世界 (STW) 情況下壓縮內(nèi)存。G1收集器將取代CMS收集器,因?yàn)樗咝А?/p>
在 G1 中收集器包含兩個(gè)階段;
打標(biāo)
掃地
與其他收集器不同,G1收集器將堆劃分為一組大小相等的堆區(qū)域,每個(gè)區(qū)域都是連續(xù)的虛擬內(nèi)存范圍。在執(zhí)行垃圾回收時(shí),G1顯示了一個(gè)并發(fā)的全局標(biāo)記階段,以確定整個(gè)堆中對(duì)象的活躍度。
標(biāo)記階段完成后,G1知道哪些區(qū)域大部分是空的。它首先在這些區(qū)域收集,這通常會(huì)產(chǎn)生大量可用空間。這就是為什么這種垃圾收集方法被稱為 Garbage-First 的原因。
要啟用 G1 垃圾收集器,我們可以使用以下參數(shù):
java -XX:+UseG1GC -jar Application.java
Epsilon 是一個(gè)不可操作的或被動(dòng)的垃圾收集器。它為應(yīng)用程序分配內(nèi)存,但不收集未使用的對(duì)象。當(dāng)應(yīng)用程序耗盡 Java 堆時(shí),JVM 將關(guān)閉。這意味著 Epsilon 垃圾收集器允許應(yīng)用程序耗盡內(nèi)存并崩潰。
此垃圾收集器的目的是測(cè)量和管理應(yīng)用程序性能?;顒?dòng)垃圾收集器是在 JVM 中與您的應(yīng)用程序一起運(yùn)行的復(fù)雜程序。Epsilon 消除了 GC 對(duì)性能的影響。沒(méi)有 GC 周期或讀取或?qū)懭胝系K。使用 Epsilon GC 時(shí),代碼是獨(dú)立運(yùn)行的。Epsilon 有助于可視化垃圾收集如何影響應(yīng)用程序的性能以及內(nèi)存閾值是多少,因?yàn)樗鼤?huì)在耗盡時(shí)顯示。例如,如果我們認(rèn)為我們的應(yīng)用程序只需要 1 GB 的內(nèi)存,我們可以使用 -Xmx1g 運(yùn)行它并查看行為。如果該內(nèi)存分配不足,請(qǐng)使用堆轉(zhuǎn)儲(chǔ)重新運(yùn)行它。請(qǐng)注意,我們必須啟用此選項(xiàng)才能獲得堆轉(zhuǎn)儲(chǔ)。
XX:HeapDumpOnOutOfMemoryError
如果我們需要充分利用應(yīng)用程序的性能,Epsilon 可能是 GC 的最佳選擇。但是我們需要對(duì)我們的代碼如何使用內(nèi)存有一個(gè)完整的了解。如果它幾乎不產(chǎn)生垃圾,或者您確切知道它在運(yùn)行期間使用了多少內(nèi)存,那么 Epsilon 是一個(gè)可行的選擇。
要啟用 Epsilon 垃圾收集器,我們可以使用以下參數(shù):
java -XX:+UseEpsilonGC -jar Application.java
ZGC 并發(fā)執(zhí)行所有昂貴的工作,不會(huì)停止應(yīng)用程序線程的執(zhí)行超過(guò) 10 毫秒,這使其適用于需要低延遲和/或使用非常大堆的應(yīng)用程序。根據(jù) Oracle 文檔,它可以處理數(shù) TB 的堆。Oracle 在 Java 11 中引入了 ZGC。Z 垃圾收集器在其線程中執(zhí)行其循環(huán)。它平均暫停應(yīng)用程序 1 毫秒。G1 和 Parallel 收集器平均大約 200 毫秒。
在 Java 12 中,即使 Z 仍處于實(shí)驗(yàn)狀態(tài),Oracle 也添加了性能修復(fù)和類卸載。它僅在 64 位 Linux 上可用。但是,ZGC 通過(guò)一種稱為指針著色的技術(shù)來(lái)利用 64 位指針。彩色指針存儲(chǔ)有關(guān)堆上對(duì)象的額外信息。這是它僅限于 64 位 JVM 的原因之一。
ZGC會(huì)嘗試自己設(shè)置線程數(shù),通常是對(duì)的。但是如果 ZGC 有太多的線程,它會(huì)餓死你的應(yīng)用程序。如果它沒(méi)有足夠的,您將創(chuàng)建垃圾比 GC 收集它的速度更快。ZGC 的階段說(shuō)明了它如何在不影響應(yīng)用程序內(nèi)存增長(zhǎng)的情況下管理大型堆。
要啟用 Z 垃圾收集器,我們可以使用以下參數(shù):
java -XX:+UseZGC -jar Application.java
Shenandoah 是一個(gè)超低暫停時(shí)間的垃圾收集器,它通過(guò)與正在運(yùn)行的 Java 程序同時(shí)執(zhí)行更多的垃圾收集工作來(lái)減少 GC 暫停時(shí)間。CMS 和 G1 都執(zhí)行活動(dòng)對(duì)象的并發(fā)標(biāo)記。Shenandoah 增加了并發(fā)壓縮。
Shenandoah 使用內(nèi)存區(qū)域來(lái)管理哪些對(duì)象不再使用,哪些對(duì)象是活動(dòng)的并準(zhǔn)備好進(jìn)行壓縮。Shenandoah 還為每個(gè)堆對(duì)象添加了一個(gè)轉(zhuǎn)發(fā)指針,并使用它來(lái)控制對(duì)對(duì)象的訪問(wèn)。Shenandoah 的設(shè)計(jì)以并發(fā) CPU 周期和空間換取暫停時(shí)間的改進(jìn)。轉(zhuǎn)發(fā)指針使移動(dòng)對(duì)象變得容易,但激進(jìn)的移動(dòng)意味著 Shenandoah 比其他 GC 使用更多的內(nèi)存并且需要更多的并行工作。但它通過(guò)非常短暫的停頓來(lái)完成額外的工作。
Shenandoah 在許多小階段處理堆,其中大部分與應(yīng)用程序并發(fā)。這種設(shè)計(jì)使 GC 可以有效地管理大堆。
Shenandoah 提供與 ZGC 相同的優(yōu)勢(shì),具有大堆但更多的調(diào)整選項(xiàng)。根據(jù)您的應(yīng)用程序的性質(zhì),不同的啟發(fā)式方法可能非常適合。它的暫停時(shí)間可能不如 ZGC 的那么短,但它們更容易預(yù)測(cè)。
要啟用 Shenandoah 垃圾收集器,我們可以使用以下參數(shù):
java -XX:+UseShenanodoahC -jar Application.java
以上就是關(guān)于“7種Java垃圾回收器”的介紹,大家如果對(duì)此比較感興趣,想了解更多相關(guān)知識(shí),不妨來(lái)關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java在線學(xué)習(xí),技術(shù)文檔中的內(nèi)容從入門到精通,細(xì)致全面,很適合沒(méi)有基礎(chǔ)的小伙伴學(xué)習(xí),希望對(duì)大家能夠有所幫助。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)