2011-07-29 13 views
32

幾乎每個人都最終遇到Java的GC問題。是否有GC問題的食譜指南?

是否有一本食譜指南或半自動工具來調整GC for Java?

我的理由是這樣的:

  • 幾乎每個人最終有這些問題
  • 有許多可能的因素(比如20),其中只有少數會影響您的問題。
  • 大多數人不知道如何識別關鍵因素,因此GC調諧更像是黑色藝術而不是科學。
  • 並非所有人都使用HotSpot虛擬機。不同的Sun版本具有不同的GC特徵。
  • 沒有什麼動機去嘗試(比如每天運行虛擬機時略有不同的設置來查看它們是如何實現的)。

所以問題的確是:有沒有什麼我可以以檢查列表的方式使用?或者甚至可能是一個分析GC日誌或堆轉儲的工具,並給我特定的提示去哪裏尋找(而不是告訴我「95%的數據分配在byte []類型的對象中,這基本上是無用的)。

相關問題:

+2

GC會自行分析並調整您可以設置的許多參數。如果您希望GC自動調諧,請將GC參數降至最低。如果您必須指定參數,那麼這些參數將專門用於您的用例,並且很難自動確定。 –

+0

我從來沒有讓自己成爲一個核對清單,因爲首先要做的事情是:•有很多動機來實驗(比如每天運行虛擬機以稍微不同的設置來看看它們是如何發揮的); D通常最簡單的解決方案只是爲了調整內存settigngs和做你自己。 –

+0

@Peter:有沒有辦法將這些參數保存爲一種「起點」,所以每次重新啓動時都不必經過雜事?或者至少看看他們? –

回答

14

參考各種GC信息:

甲骨文

Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine

,這也

Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning

IBM

Fine Tuning Garbage Collection [鏈接死]

Extensible Verbose Toolkit

SAP JVM

Memory Management (Garbage Collection)

Detecting Memory Leaks

Detecting Hanging/Looping VMs

Analyzing Out-of-Memory Situations

對不起,我不知道很多關於SAP,但也提供了一些事情,我已經找到。

至於食譜,調整最有可能是應用程序特定的這個級別,但它是一個有趣的話題。

附錄

您也提到的分析工具。有些考生在此列出:

Know of any Java garbage collection log analysis tools?

+0

感謝您的努力,但這僅適用於HotSpot。來自SAP和IBM的Java虛擬機如何? –

+0

我已經增加了更多此答案。不確定SAP我一直認爲它是Sun JVM的包裝。 – Merlin

+0

+1。我會等待幾天,然後再接受它,希望有人能夠更好地滿足我的願望清單:-) –

18

的各種資源,我編了一理智清單,我用它來分析GC的行爲和我的應用程序的性能。 這些準則是通用的,適用於任何供應商特定的JVM,但也包含用於說明的特定於HotspotVM的信息。

  1. 禁用顯式GC。明確的GC是一種不好的編碼習慣,它從來沒有幫助。使用-XX:+DisableExplicitGC

  2. 啓用完整的GC記錄。輕量級但強大。

    • 計算實時數據集分配率,並促銷價格。這會告訴你,如果你需要一個更大的堆或如果你的。年輕一代太小,或者如果你的倖存者空間溢出等等。
    • 計算總的GC時間,應該是<總運行時間的5%。
    • 使用-XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
  3. 考慮收集有關您的GC信息的補充手段。日誌記錄很好,但有時候可用的輕量級命令行工具會給你更多的見解。例如。 jstat的熱點,這將顯示出伊甸園,倖存者和老將軍

  4. 收集類的直方圖你的職業/能力這些都是lightweigh並會告訴你堆的內容。一旦您發現了一些奇怪的GC活動可以拍攝快照,或者你可以前把他們/全GC後:在OldGen空間的

    • 內容:你可以找出哪些對象駐留在OldGen。您需要在Full GC之前和之後打印直方圖。而且由於YoungGen系列在Full GC之前執行,所以這些柱狀圖將向您顯示舊一代的內容。使用-XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC.
    • 檢測過早提升的對象:要確定是否提前升級任何實例,您需要研究柱狀圖以查看哪些類預期駐留在OldGen中,哪些類只能在YoungGen中看到。這不能自動完成,你需要推理每個類及其實例的目的,以確定該對象是否是臨時的。
  5. 考慮不同的GC算法。虛擬機通常帶有幾種不同的GC實現,它們提供各種折衷:吞吐量,佔用空間,暫停/短暫停頓,實時等。考慮您擁有的選項並選擇滿足需求的選項。

  6. 小心敲定()。使用finalize()檢查GC是否跟上課程。此方法的執行可能非常昂貴,並且可能會影響GC和應用程序吞吐量。

  7. 堆轉儲。這是重量級的第一步,會影響正在運行的應用程序。收集堆轉儲以進一步研究堆內容或確認步驟4中觀察到的假設。使用

資源:

書籍:

講座/文章:

郵件列表: