2013-01-09 38 views
4

獲取Xms/Xmx/XX:MaxPermSize的優化值時需要採取哪些步驟?優化Xms/Xmx/XX:JVM中的MaxPermSize

當然,我可以設置一個很大的值,但正如你所知,GC需要大量內存的時間。什麼是一般建議,當我可以騰出時間測試並找到這些值

例如,下圖有幫助嗎?

Eden Space heap usage - 42MB/62MB (used/committed) 
Survivor Space heap usage - 8.5MB/8.5MB (used/committed) 
CMS Old Gen heap usage - 100MB/217MB (used/committed) 
Non-heap memory pool usage - 36MB 
+0

見http://www.curiousmentality.co.uk/2011/11/tuning-jvm-memory-settings /獲取一些實用信息 – rmuller

+0

請參閱GC調優問題:http://stackoverflow.com/q/6871213/772000 –

回答

1

一般規則是,在發現需要解決的問題之前,不應更改JVM內存設置。 JVM在調整運行時的大部分參數方面做得非常好,以適應您的應用程序。

如果您發現需要優化內存參數,則取決於您需要優化的內容。您將使用的設置會根據您需要優化哪個方面(例如,最大限度地減少暫停與最大化吞吐量的設置非常不同)而有很大差異。

如果您確實需要優化,請提供更多關於您需要優化的方面的信息。

1

小時的極少數情況下,我需要調整這些值有一個叫JavaVisualVM方案,其中包括在JDK(bin文件夾我覺得)我覺得這是非常有用的。您可以連接到正在運行的虛擬機並分析其所有運行時參數。

在「插件」部分,您還可以找到一個非常有用的監控gc的插件,您可以在其中查看究竟發生了什麼。

4

調整GC時,您需要在較長時間內收集GC統計信息,然後採取相應措施。只有一代代大小的快照是不夠的。

您應該:

  1. 啓用完整的GC日誌。輕量級但強大。

    • 使用-XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
  2. 考慮收集有關您的GC信息的補充手段。日誌記錄很好,但有時候可用的輕量級命令行工具會給你更多的見解。例如。 jstat的熱點,這將顯示出伊甸園,倖存者和老將軍

  3. 計算你的職業/容量:

    • 實時數據集分配率,並促銷價格。這會告訴你,如果你需要一個更大的堆或如果你的。 Young Gen太小,或者您的倖存者空間溢出等。
    • 總GC時間,應該是<總運行時間的5%。通過這種方式,您可以判斷您的總體GC策略是否正常。
    • 觀察燙髮根佔領

一旦你有了這個數據,你就可以開始施膠代,並再次監測所做的更改的影響。該通常建議的大小吞吐量是:

  • 老根實時數據集的 = 1.5-2x - 你的數據集應該輕鬆融入OldGen空間。
  • Perm Gen =通常PermGen職業的1.5倍。
  • 楊根 =根據分配率。看看你多少分配一秒鐘,然後看看促銷率,通過增加YoungGen降低促銷率。
  • 倖存者空間 =顯示器服務年限和促銷率。

一般來說,取決於你調優的目標尺寸建議:

  • 吞吐量調整 - 見上面,
  • 低延遲優化 - 監控GC暫停
    • 年輕GC太長=>減少年輕人的生日
    • 年輕GC過於頻繁=>增加年輕代
  • 足跡調整 - 調整根據LiveDataSet,升學率和分配率的大小。您可能不需要在吞吐量調整

見每個空間添加額外的一房也是GC優化問題:Is there a cookbook guide for GC problems?