眾所周知,垃圾收集是影響性能的事情之一,所以我們應該努力學習GC的基本知識,特別是因為Java8在這一領域做了一些重大的更改和改進,尤其是隨著PermGen的刪除和一些新的令人興奮的優化。通過參加java培訓,學習最新java技能,可以讓你的實力一直保持領先水平,提升行業競爭力。
當我們談論垃圾收集時,絕大多數人都知道這個概念,并在日常編程中使用它。即便如此,我們還是有很多不理解的地方。關于JVM最大的誤解之一是它有一個垃圾收集器,實際上它提供了四個不同的垃圾收集器,每個垃圾收集器都有自己獨特的優點和缺點。選擇使用哪一個是由你自己決定的,吞吐量和應用程序暫停之間的差異可能是巨大的。
這四種垃圾收集算法的共同點是,它們是分代的,這意味著它們將托管堆劃分為不同的部分,使用了一種古老的假設,即堆中的大多數對象都是短暫的,應該快速回收。
1.串行收集器
串行收集器是最簡單的,也是你可能不會使用的,因為它主要是為單線程環境(例如32位或Windows)和小堆設計的。這個收集器在工作時會凍結所有應用程序線程,這使得它在任何情況下都不能在服務器環境中使用。在java培訓中,有很多關于Java開發工具、庫和框架的培訓課程,在專業老師的教學指導下,可以很全面地掌握相關知識和技能。
如何使用它:你可以通過打開-XX:+UseSerialGCJVM參數來使用它
2.并行/吞吐量收集器
接下來是并行收集器。這是JVM的默認收集器。就像它的名字一樣,它最大的優點是使用多個線程來掃描和壓縮堆。并行收集器的缺點是,當執行次要或完整GC收集時,它將停止應用程序線程。并行收集器最適合那些可以容忍應用程序暫停并試圖優化收集器導致的較低CPU開銷的應用程序。
3.CMS收集器
并行收集器的后續是CMS收集器(“并發標記掃描”)。該算法使用多個線程(“并發”)在堆中掃描(“標記”)可回收的未使用對象(“掃描”)。在兩種情況下,該算法將進入“停止世界”(STW)模式:當初始化根(舊一代中可以從線程入口點或靜態變量訪問的對象)的初始標記時,以及當應用程序在算法同時運行時更改了堆的狀態時,迫使它返回并做一些最后的潤色,以確保它標記了正確的對象。對Java感興趣的同學可以參加java培訓,可以獲得快速有效的學習。
使用此收集器時,最大的問題是遇到升級失敗,即在收集年輕一代和老年一代之間發生競爭的情況。如果收集器需要將年輕的對象提升到舊一代,但沒有足夠的時間騰出空間來清除它,它將不得不首先這樣做,這將導致完整的STW收集——這正是CMS收集器想要防止的事情。為了確保這種情況不會發生,你可以增加舊一代的大小(或者整個堆的大小),或者為收集器分配更多的后臺線程,讓他與對象分配的速率競爭。
與并行收集器相比,該算法的另一個缺點是,它使用更多的CPU,通過使用多個線程執行掃描和收集,為應用程序提供更高級別的連續吞吐量。對于大多數不利于應用程序凍結的長期運行的服務器應用程序,這通常是一個很好的權衡。即便如此,該算法在默認情況下也不會啟用。你必須指定XX:+USeParNewGC才能真正啟用它。如果你愿意分配更多的CPU資源來避免應用程序暫停,假設你的堆大小小于4Gb,這就是你可能想要使用的收集器。然而,如果它大于4GB,你可能會想使用最后一種算法——G1收集器。想學習java技術的同學,不妨報個Java培訓班,有明確清晰的學習路線,理論知識+實戰操作,可以獲得快速提升。
4.G1收集器
JDK7更新4中引入的垃圾優先收集器(G1)旨在更好地支持大于4GB的堆。G1收集器利用多個后臺線程來掃描它劃分為區域的堆,范圍從1MB到32MB(取決于堆的大小)。G1收集器旨在首先掃描那些包含最多垃圾對象的區域,并將其命名為(垃圾優先)。此收集器是使用–XX:+UseG1GC標志打開的。
此策略降低了在后臺線程完成對未使用對象的掃描之前堆被耗盡的可能性,在這種情況下,收集器將不得不停止應用程序,這將導致STW收集。G1還有另一個優點,那就是它在移動中壓縮了堆,而CMS收集器只在完整的STW收集過程中才這樣做。在java培訓中,不僅有理論知識的課程,還有大量實戰項目學習,讓你在實踐中真正掌握Java知識和技能。
在過去的幾年里,大型堆一直是一個相當有爭議的領域,許多開發人員從每臺機器的單個JVM模型轉向每臺機器有多個JVM的更微服務、組件化的架構。這是由許多因素驅動的,包括希望隔離不同的應用程序部分,簡化部署,避免將應用程序類重新加載到內存中通常會帶來的成本(這在Java8中實際上得到了改進)。
即便如此,在JVM中,這樣做的最大驅動因素之一源于避免大型堆中出現的長時間“停止世界”暫停(在大型集合中可能需要幾秒鐘)的愿望。Docker等容器技術也加速了這一進程,使你能夠相對輕松地在同一物理機器上部署多個應用程序。
總結
這些收集器中的每一個都通過一系列切換和開關進行了不同的配置和調整,每個都有可能增加或減少吞吐量,所有這些都基于你的應用程序的特定行為。參加java培訓是入門學習的最佳選擇,有經驗豐富的專業老師面授指導教學,通過理論結合實戰的方式教授java基礎知識,幫助你更好的理解與運用java。