7

私のアプリは「Old Generation」/「Tenured Generation」のサイズの増加を示しており、これが「Old Gen」の最大制限に達すると、突然 PermGen のサイズが増加します。私の世代のサイジングは次のとおりです。

-Xmx1200m -Xms1200m -Xmn450m -XX:MaxPermSize=600m -XX:+UseParallelGC

これは 32 ビットの Fedora 上にあるため、これより大きなヒープを持つことはできません。

このアプリは、Spring IOC と Hibernate を使用していますが、特別なクラスローディングは行っていません。Spring App-context.xml は、約 1000 の Bean を定義しています。

このアプリは 175MB の PermGen から始まり、数時間で ~250MB まで着実に増加し、Tenured Generation が ~780MB に達するまでそのままで、その後 permgen は ~500MB にジャンプし、Old Gen は ~500MB に低下します。

これにより、毎日アプリを再起動する必要があり、OutOfMemory エラーが迫ってくるのではないかと本当に恐れています。

ありがとう Gala101

5 月 13 日: 「Old Gen」がガベージ コレクションされるとどうなるか、誰かに光を当ててもらえませんか?
jvm は「Old Gen」からのコレクションを PermGen に入れますか?
PermGen のスパイクは、「Old Gen」からのコレクションが発生した場合にのみ発生します。また、OldGen のサイズの減少は、PermGen のサイズの増加とほぼ一致します。
PS: PermGen を確実に消費するため、ライブ デプロイ/アンデプロイは行いません。
以下は、私の監視ページからの現在のスパンショットです: (コミットされた部分は、約 250 MB から 500 MB にジャンプしました)

    PS Perm Gen
Type    Non-heap memory
Usage   init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K)
Peak Usage  init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K)
Collection Usage    init = 16777216(16384K) used = 252421536(246505K) committed = 504954880(493120K) max = 629145600(614400K)
4

3 に答える 3

2

leonm のアドバイスに従って、何がメモリを大量に消費するかを分析します。ある種の厄介なメモリリークがあるに違いありません。

派手なクラスローディングを行っていないと言いますが、Hibernate はその場でいくつかのクラスを生成します。いくつかの AOP 機能を使用していますか (例: Spring AOP モジュールから)。

基本的に、PermGen スペースが不足している場合、アプリケーションは新しいクラスを生成し続けているように見えます (PermGen に格納されているクラスであるため)。

于 2010-05-12T21:50:58.573 に答える
0

appserverでアプリをデプロイ/アンデプロイし続けると、Permgenがリークします。

これがappserverのせいではないことの詳細については、このリンクを確認してください。

http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

于 2010-05-13T08:20:05.777 に答える
0

サーバーを再起動してEclipse MATで分析する前に、jmap を使用してメモリ ダンプを作成します。

于 2010-05-11T10:49:42.093 に答える