JVM筆記四——HotSpot虛擬機垃圾收集調整指南(JDK12官方文檔翻譯)

HotSpot虛擬機垃圾收集調整指南

垃圾收集調整簡介(Introduction to Garbage Collection Tuning

         爲了支持java應用的多樣性,Java HotSpot VM提供了多個垃圾收集器,每個垃圾收集器都旨在滿足不同的需求。JavaSEr根據運行應用程序的計算機類選擇最適合的垃圾收集器。但是,這種選擇對於每個應用程序可能都不是最佳的,具有嚴格性能目標或其他目的的用戶,開發人員或者管理員可能需要明確選擇垃圾收集器並調整某些參數以實現性能級別。本文檔提供了有助於完成這些任務的信息。

         首先,垃圾收集器的一般特性和基本的調優選項將在“stop-the-world collector”系列的上下文中描述。然後介紹其他垃圾收集器的特點,以及選擇垃圾收集器時應該考慮的因素。

1、什麼是垃圾收集器

         垃圾收集器(GC)自動管理應用程序的動態內存分配請求。

垃圾收集器通過以下操作執行自動動態內存分配:

         1.從操作系統(OS)分配內存,並將分配的內存返回給操作系統;

         2.在應用程序請求內存時將應用程序返回分發給應用程序;

         3.明確應用程序仍在使用該內存的哪些部分;

         4.回收未使用的內存,供程序重新使用。

Java HotSpot垃圾收集器採用以下技術來提高這些操作的效率:

         1.將代際清除與週期老化結合使用,將目標集中在堆中最有可能包含大量內存可回收內存區域的區域。(Use generational scavenging in conjunction with aging to concentrate their efforts on areas in the heap that most likely contain a lot of reclaimable memory areas.

         2. 儘量多的使用多線程進行併發操作,或者在程序運行的同時,在後臺執行一些運行時間比較長的操作(long-running-operations)(奉上原文,這段我用幾個翻譯軟件翻譯的都不準確Use multiple threads to aggressively make operations parallel, or perform some long-running operations in the background concurrent to the application.)。

         3.通過壓縮對象,獲取更多的連續內存空間。

爲什麼垃圾回收器的選擇特別重要?

         垃圾收集器的目的是使軟件開發人員免於手動地動態內存的管理,開發人員無需將分配與解除分配相匹配,並且可以密切關注分配的動態內存的生命週期。這完全消除了與內存管理相關的錯誤,而代價就是一些額外的運行時開銷,Java HotSpot VM提供了一系列的垃圾回收算法供您選擇。

         什麼時候選擇垃圾收集器更重要?對於某些應用程序,答案永遠不會是。也就是說,在垃圾收集器暫停的頻率和持續時間適中的情況下,應用程序可以很好的運行。但是對於大型的應用程序,尤其是那些具有大數據量(幾十億字節)、多線程和高事務率的應用程序,情況並非如此。

         阿姆達爾定律(Amdahl's law,給定問題的並行加速受到問題的連續部分的限制。)意味着大多數工作負載不能完美並行化,有些部分總是連續的,並沒有從並行中受益。在Java平臺中,目前有四種垃圾回收替代方案,出了其中一個,即“串聯GC”,其他的都可以並行化工作,以提高性能。儘可能低地降低垃圾收集的開銷是必要的,這可以在下面的事例中看出。

圖1-1比較垃圾收集花費的時間百分比

         圖1-1的圖表完美的模擬了一個理想的系統,除了垃圾收集器之外,該系統具有完全的可擴展性。紅線是在一個單處理器系統上只花了1%的時間進行垃圾處理的應用程序。這意味着在32位的系統上,其吞吐量損失超過了20%。洋紅色的線表示,對於垃圾回收時間爲10%的應用程序(單處理器應用程序中,垃圾收集時間不算太長),當擴展到32位時,系統將損失75%以上的吞吐量。

         該圖顯示,在小型系統上開發時,其可以忽略地吞吐量問題,在大型系統上卻成爲了瓶頸。然而,在減小這種瓶頸上的微小改進,可以在系統性能上得到顯著的提高。對於足夠大的系統,選擇正確的垃圾收集器並在必要的時候對其進行優化是值得的。

         串行GC通常適用於大多數小型應用,尤其是那些在現代處理器上需要高達100M字節的堆的應用。其他GC有額外的開銷或者複雜性,這是專業行爲的代價。如果,應用程序不需要備用GC,請使用串行收集器。有一種情況串行收集器不可能是最佳選擇,那就是一個運行在具有大內存和兩個及以上的處理器的機器上的、大型的多線程應用程序。當應用程序在這種服務器類機器上運行時,默認情況下會選擇G1垃圾回收器。

文檔中支持的操作系統

         本文檔及其建議適用於所有JDK 12支持的系統配置,受特定配置中某些垃圾收集器的實際可用性限制。 請參閱Oracle JDK認證系統配置。

 

參考文檔(JDK12官方文檔)

https://docs.oracle.com/en/java/javase/12/gctuning/introduction-garbage-collection-tuning.html#GUID-223394DF-2E27-4F5D-A7DF-83151EB577BB

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章