簡體   English   中英

Java 1.5 Gc調整

[英]Java 1.5 gc tuning

我們有一個大型應用程序,分配的堆最小為2 GB,最大為8 GB。 在負載測試期間,我們發現暫停時間非常長,GC周期長達16+秒。 最初,我們使用的是“ -XX:+ UseParNewGC”,但是切換到UseParallelGC可以大大提高我們的性能,但是確實存在負載下更長的暫停時間的問題。

我們嘗試了一些選擇,例如增加年輕一代,但似乎無濟於事,還有什么可以嘗試的呢? 如果需要,我們可以自由增加堆大小,但是我想知道這是否會使gc暫停惡化。 如果什么也做不了,我正在考慮使用具有5 GB堆而不是1個較大堆的群集應用服務器。 隨附了當前gc日志的快照

J  
J Thu Jun 23 12:40:56 2011
J  [GCJ  
J Thu Jun 23 12:40:57 2011
 [PSYoungGen: 2130792K->475247K(2084160K)] 7198716K->5543171K(7676608K), 1.3280110 secs] [Times: user=0.00 sys=1.88, real=1.33 secs] 
J  
J Thu Jun 23 12:41:00 2011
J  [GCJ  
J Thu Jun 23 12:41:01 2011
 [PSYoungGen: 1966319K->417801K(1908928K)] 7034243K->5546416K(7501376K), 0.7025950 secs] [Times: user=0.01 sys=1.89, real=0.71 secs] 
J  
J Thu Jun 23 12:41:12 2011
J  [GCJ  
J Thu Jun 23 12:41:13 2011
 [PSYoungGen: 1908873K->269608K(2155520K)] 7037488K->5523748K(7747968K), 1.3117340 secs] [Times: user=0.01 sys=1.44, real=1.31 secs] 
J  
J Thu Jun 23 12:41:33 2011
J  [GC [PSYoungGen: 1747432K->138147K(1616000K)] 7001572K->5593865K(7208448K), 0.4949960 secs] [Times: user=0.01 sys=1.40, real=0.50 secs] 
J  [Full GCJ  
J Thu Jun 23 12:41:50 2011
 [PSYoungGen: 138147K->0K(1616000K)] [PSOldGen: 5455718K->3456287K(5592448K)] 5593865K->3456287K(7208448K) [PSPermGen: 256273K->256273K(524288K)], 17.0259440 secs] [Times: user=0.00 sys=16.88, real=17.02 secs] 
J  
J Thu Jun 23 12:42:09 2011
J  [GC [PSYoungGen: 1477824K->85118K(2110848K)] 4934111K->3541406K(7703296K), 0.1437050 secs] [Times: user=0.00 sys=0.30, real=0.14 secs] 
J  
J Thu Jun 23 12:42:20 2011
J  [GC [PSYoungGen: 1573438K->71812K(2100352K)] 5029726K->3600767K(7692800K), 0.2477960 secs] [Times: user=0.00 sys=0.65, real=0.25 secs] 

查看您的日志,最大的收藏(第17個第二收藏)正在收集舊的(使用期限的)圖書。 在Sun JVM上使用並發垃圾收集器應該有所幫助(+ XX:UseConcMarkSweepGC),因為這將(主要)同時進行收集,從而減少了暫停時間)。

對於正在收集的數據量,年輕一代的停頓也相當大。 您在什么機器上運行? 這些暫停也不是那么頻繁,因此,如果您的目標是減少暫停時間,請嘗試減小年輕一代的大小(-XX:NewRatio),這將導致更短,更頻繁的暫停。

您還應該確保計算機上沒有交換發生。 您沒有說要運行什么操作系統,而是在Linux上運行:

vmstat 5

並在發生這些大型GC時檢查“ si”和“ so”列。 如果它們不為零,則減少計算機上的內存使用量,或調整“ swappiness”可調參數。

考慮使-Xms和-Xmx值相同。 如果您願意為堆提供最大8GB的大小,那么也要使該最小值為8GB。 這樣,JVM不必擔心分配更多的內存。

完整GC的頻率如何? 如果它們經常發生,那么您可能需要對應用程序進行概要分析,而不是最后對最終無關緊要的gc參數進行調整。 找出為您分配所有內存的內容,然后查看是否有減少內存的方法。

在JDK 1.5和JDK 1.6上,當您傳遞2到4 GB的堆內存時,GC暫停會增加。 將需要更大數據堆的應用程序集群化是一種選擇。 我知道的另一個正在考慮使用替代JVM。 如果您使用8 GB的堆,則可能會在JDK 1.7上看到改進。 有一些優化。 此外,Sun / Oracle還需要考慮其他幾個JVM。

如果您還沒有閱讀過這篇文章,那么它對於Java 5.0 / JDK 1.5來說是非常強大的。 它可能有所幫助。 調優Java 5.0 我會更詳細地介紹,但是上面的注釋確實涵蓋了一些元素。

或者,市場上還有另一種JVM,它來自一家名為Azul Systems的私人公司。 他們有一些開源工具來檢查其C4收集器是否可以提供幫助。 它們具有一個JVM平台,可在您的應用程序運行時並行運行。 如果他們的JHiccup工具說您遇到GC問題,那么他們可以提供企業JVM。 成本不是免費的,因此,如果您正在考慮小型部署(一台服務器)和價值低於10,000美元的問題,那么我會(1)考慮使用備用的免費JVM,(2)如果可以在其上運行,請嘗試其他JVM (例如JDK 1.6 / 1.7)。 如果這些都不是可選項,請嘗試群集,但請使用低於4GB的堆。

我在這里所做的唯一一點是,在選擇JVM時有“ ARE”選項。 JRocket確實可以幫助某些應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM