2010-12-02 1 views
2

私は時々問題が発生したときに情報を収集しようとしています。数週間の操作の後、アプリケーションが遅くなり、うまく動作し、遅くなり、うまく動作し、 。私の理論は、時間が経つにつれて、より頻繁にガベージコレクションが行われるということです。その他の重要な情報は、時々OOM PermGenの問題を経験したことです。Java: 'tenured'メモリーはpermgenと同じですか?

有効にしたverbose:gcを入れて、catalina.outのGC出力を表示します。私はここの情報に基づいて、しかし、PrintGCDetailsフラグを追加する必要があると思う:

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

は、後者のフラグが「終身」は、メモリのコレクションに関する情報を出力します有効。問題は、PermGenエラーを引き起こすメモリか、それとも何か違うのでしょうか?それが違う場合は、どのようにしてPermGenスペースを表示する情報を記録できますか?

EDIT - 残念ながら、この環境ではjvm監視ツールを添付できません。

EDIT - 私が言った設定オプションを追加しただけでなく、印刷の殿堂入り分布のための1つ、私は

27.701: [GC 27.701: [ParNew 
Desired survivor size 2162688 bytes, new threshold 4 (max 4) 
- age 1: 1906560 bytes, 1906560 total 
- age 2:  2064 bytes, 1908624 total 
- age 3:  5064 bytes, 1913688 total 
- age 4:  650368 bytes, 2564056 total 
: 35684K->2678K(38336K), 0.0068580 secs] 224179K->191173K(1065664K), 0.0069700 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

ようなものを得るpermgenスペースParNew世代ですか?

(concurrent mode failure): 25387K->31940K(1027328K), 0.2983200 secs] 50714K->31940K(1065664K), [CMS Perm : 35273K->35139K(35392K)], 0.2985210 secs] [Times: user=0.30 sys=0.00, real=0.30 secs] 
(concurrent mode failure): 25356K->31941K(1027328K), 0.3032690 secs] 50861K->31941K(1065664K), [CMS Perm : 35264K->35129K(35392K)], 0.3034800 secs] [Times: user=0.30 sys=0.00, real=0.31 secs] 

失敗は私を悩ませています。

事前にありがとう

+0

VisualVMでVmを見ることができます。 – ZeissS

+0

私たちの環境ではオプションではない@ZeissSは、すべてがロックダウンされています:( – hvgotcodes

答えて

4

終身とPermGenはありません、同じではありません。それらは関連していますが、同じものではありません。正確な詳細は、使用しているJVMの実装に依存しますが、リンクしたドキュメントから:

"永続的な世代は永続的な世代です。 Java言語レベルで同等のものを持たないオブジェクトを記述するために仮想マシンが必要とするデータ。たとえば、クラスやメソッドを記述するオブジェクトは、永続的な世代に格納されます。

Interned文字列とクラスの詳細などは通常PERMに格納されますが、長期間使用されるJavaオブジェクトはTENUREDです。ここで

はPermGen(とどのようにそれを微調整する)を説明まともな記事です:http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

+0

私はtenureとpermgenの解明が間に合わなかった私が投稿した記事では、permgen情報をダンプするためにjvmを取得することについて何も表示されません - 私もそれを逃しましたか? – hvgotcodes

+0

このリンクは、私が追加しようとしているフラグがpermgen情報を出力していることを示しています... http://rajakannappan.blogspot.com/2010/01/outofmemoryerror-on-heapspace-permgen.html – hvgotcodes

+0

まあ、通常の-XX:+ PrintGCDetails(Sun VMの場合)はPermGenの統計情報を表示すると思います。後のコメントでGrailsアプリだと、実行時にクラスを操作するなどして、PermGenのことが表示されるのに時間がかかることに意味があります。単にそれをバンプするそれを助けるはずですが、あなたが言った一般的な遅さのために、あなたは本当にプロファイラを実行するための何かを理解したいでしょう(おそらく、あなたが問題を再現しようとすると、 prodを監視することはできません)。 –

1

あなたはどんな文字列のインターンまたはいずれかのクラスをロードしていますか?

私がpermgenスペースを食べていた2つの事柄は、あなたがそうしてはいけない文字列をインターンするときです(こうして、あらゆる種類のungarbagecollectable Stringsを作ります)、そして新しいクラスTomcatを再デプロイすると、十数回かそこらの後にこれが起こります)。

私はTomcat 6が再デプロイメントの問題で優れていたことを覚えているようで、7人はそれを修正することになっていましたが、それは私の頭の上から外れています。

外部ライブラリまたはネイティブコードライブラリを使用していますか?彼らが漏れたリソースがpermgen(数え切れないほどのもの)に対して数えれば、私は驚かないでしょう。

+0

これは再起動ではありません問題。私たちは通常の操作の間にpermgenを使い果たします。これはGrailsアプリケーションなので、実行時に動的に生成されるあらゆる種類のものがあります。これについては、私はちょうど情報を収集しようとしています - jvmにpermgen情報を出力するにはどうしたらいいですか? – hvgotcodes

+0

[重複コメントの削除] – hvgotcodes

+0

@gvgotcodes - 再起動すると、クラスロードが非常に多くなります。クラスの定義を変更するたびに、Groovyはそれを再生成する必要があり、それがクラスのロードを引き起こします。それは問題を引き起こすのに十分時間がかかります。何が起こっているかを知るためには、jstatツール(Javaの一部)を使う必要があります。しかし、それは難しいです。私は現時点で私のサーバー上で実行することができません、それはJavaが表示されないと言います。 JXMの監視(あなたが言っている)は簡単です。 – MBCook

関連する問題