2009-08-13 2 views
5

につながる:縮小遺族スペースが、私は走るTomcatサーバーを使用して、この厄介な経験を持っていたcontinuosフルGC

  • 当社Hudsonサーバー。
  • 私たちのWebアプリケーションのステージングバージョンは、1日に5〜8回再展開されました。

問題は、私たちは連続的なガベージコレクションに終わるが、古い世代はいっぱいに近づいていないということです。私は、Survivor領域がinexistingの隣にあることに気付きましたし、ガベージコレクタ出力は次のようになります。

[GC 103688K->103688K(3140544K), 0.0226020 secs] 
[Full GC 103688K->103677K(3140544K), 1.7742510 secs] 
[GC 103677K->103677K(3140544K), 0.0228900 secs] 
[Full GC 103677K->103677K(3140544K), 1.7771920 secs] 
[GC 103677K->103677K(3143040K), 0.0216210 secs] 
[Full GC 103677K->103677K(3143040K), 1.7717220 secs] 
[GC 103679K->103677K(3143040K), 0.0219180 secs] 
[Full GC 103677K->103677K(3143040K), 1.7685010 secs] 
[GC 103677K->103677K(3145408K), 0.0189870 secs] 
[Full GC 103677K->103676K(3145408K), 1.7735280 secs] 

ヒープ情報をTomcatを再起動する前に、次のとおりです。

Attaching to process ID 10171, please wait... 
Debugger attached successfully.    
Server compiler detected.      
JVM version is 14.1-b02      

using thread-local object allocation. 
Parallel GC with 8 thread(s)   

Heap Configuration: 
    MinHeapFreeRatio = 40 
    MaxHeapFreeRatio = 70 
    MaxHeapSize  = 3221225472 (3072.0MB) 
    NewSize   = 2686976 (2.5625MB) 
    MaxNewSize  = 17592186044415 MB  
    OldSize   = 5439488 (5.1875MB) 
    NewRatio   = 2      
    SurvivorRatio = 8      
    PermSize   = 21757952 (20.75MB) 
    MaxPermSize  = 268435456 (256.0MB) 

Heap Usage: 
PS Young Generation 
Eden Space: 
    capacity = 1073479680 (1023.75MB) 
    used  = 0 (0.0MB) 
    free  = 1073479680 (1023.75MB) 
    0.0% used 
From Space: 
    capacity = 131072 (0.125MB) 
    used  = 0 (0.0MB) 
    free  = 131072 (0.125MB) 
    0.0% used 
To Space: 
    capacity = 131072 (0.125MB) 
    used  = 0 (0.0MB) 
    free  = 131072 (0.125MB) 
    0.0% used 
PS Old Generation 
    capacity = 2147483648 (2048.0MB) 
    used  = 106164824 (101.24666595458984MB) 
    free  = 2041318824 (1946.7533340454102MB) 
    4.943684861063957% used 
PS Perm Generation 
    capacity = 268435456 (256.0MB) 
    used  = 268435272 (255.99982452392578MB) 
    free  = 184 (1.7547607421875E-4MB) 
    99.99993145465851% used 

に渡され、関連するJVMフラグTomcatの場合:

-verbose:gc -Dsun.rmi.dgc.client.gcInterval=0x7FFFFFFFFFFFFFFE -Xmx3g -XX:MaxPermSize=256m 

起動時に約40MBのサイズになることに注意してください。

この問題を回避する方法については、ご了承ください。


更新:

JVMのバージョンが

$ java -version 
java version "1.6.0_15" 
Java(TM) SE Runtime Environment (build 1.6.0_15-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 14.1-b02, mixed mode) 

私はそれが助け場合PermGenサイズをぶつけと見に見に行くよである - 生存者の、おそらくサイズスペースは関係ありませんでした。

+0

http://stackoverflow.com/questions/11339679/100-full-eden-space-0-used-survivor-space-garbage-collection-not-done/28421053#28421053 –

答えて

12

キーはおそらく​​99.999%である(256のうち唯一の184 バイト *** MB ***無料)です。

通常、私はあなたにそれより多くのperm genを与えることを提案しますが、あなたはすでにそれを十分にすべき256MBにしました。私の推測では、いくつかのコード生成ライブラリではメモリリークがあります。 Perm Genは主にクラスのバイトコードに使用されます。

+1

あなたはそうです'PermGen'空間を最大にします。以前のように、私はOutOfMemoryErrorを投げることを期待していたので、これまで気付かなかった。私はそれを撃つだろう。 –

+1

コード生成が漏れているとして、私は残念なことに、この単純なWebアプリケーションでこのPermGenの問題を見るようになりました。 Springベースのアプリケーションを再デプロイするだけです。 –

+0

多くの再デプロイが共通の問題であるためにPermGenがなくなります。誰がクラスを漏らしているかはまだ分かります。通常のようにプロファイラーを使用しますが、クリーンアップされないオブジェクト(リソース、DB接続など)をチェックしてください。 –

4

これは、継続的に展開されるアプリケーションサーバーにとって珍しいことではないと思います。あなたに満ちているperm genのスペースは、クラスが行く場所です。 JSPはJavaクラスとしてコンパイルされ、JSPを変更すると新しいクラスが生成されてロードされることに注意してください。

私たちはこの問題を抱えていました。私たちの解決策は、アプリケーションサーバーを時折再起動させることです。

  1. 展開ハドソンを別のサーバーにステージングサーバー
  2. 設定ハドソンから随時ステージングサーバーを再起動する:

    これは私がやるだろうものです。次の2つの方法のいずれかを実行できます。

    1. 定期的に再起動します(例:、毎晩深夜に、ビルド活動があるかどうかに関係なく)。または
    2. Webアプリケーションデプロイメントジョブでサーバーの再起動ジョブがトリガーされるようにします。これを行うと、すべてのビルドでサーバを再起動しないように(つまり、2時間以内に2つのWebアプリケーションのデプロイメントが発生した場合) 、1つのサーバーの再起動をトリガーするだけです)。
+0

私はこの同じ正確な問題を抱えていて、同じビルドでHudsonによって展開される私のwebappのステージングバージョンに同じソリューションを使用しました。溶液?毎晩このTomcatを再起動します。これはテストのためだけに使用されるため、私たちは大丈夫です。 –

4

エデンとSurvivor領域との間の比を設定-XX:SurvivorRatioフラグ。 JDK 1.5 tuning docによれば、デフォルト値は32で、これは1:32の比率です。これはあなたが見ているものに一致しています。私には信じられないほど小さいと思われますが、非常に少数の物だけがエデンから生存者空間に向かうことが期待されています。

したがって、長寿命のオブジェクトが多いと仮定すると、生存率が低下するはずです。リスクは、スタートアップフェーズで長寿命のオブジェクトしか持たないため、Edenのサイズが制限されてしまうことです。テストサーバーでは、これが問題になるとは思わない。

また、私はおそらく-XX:NewRatio(デフォルトは3)を増やして、エデンスペースのサイズを縮小しています。私の腸は、若い世代には100MBほどで十分だと言っています。ガベージコレクションのコストを高めて、そのような大量のスペースを確保するだけです(つまり、オブジェクトはEdenで長すぎます)。しかし、それはちょうど本能であり、あなたの環境のために確かに検証されるべきです。


と半関連のコメントは、他の回答を読んだ後:あなたはpermgenスペースが不足のエラーを見ていない場合、それをいじるあなたの時間を費やすことはありません。 permgenは残りのヒープとは別に管理されます。

+0

それは14.1はHSビルドであり、Javaバージョンではありません。質問を詳細に更新します。 –

+0

OK、投稿のその部分を削除します。それが奇妙で、それを呼び出すことを望んでいたと思った。 – kdgregory

6

ClassLoaderのリークは非常に簡単です。ClassLoaderによってロードされる単一のオブジェクトは、ClassLoaderによってロードされないオブジェクトによって参照されます。常に再デプロイされたアプリはすぐにPermGenSpaceを埋めるでしょう。

This articleは何を調べるべきかを説明しており、a followupは問題の診断と解決方法を説明しています。

関連する問題