IBM iSeries システムで、Java プログラムを実行しています。これは、すべて社内で開発された Web サーバー コンポーネントを備えたアプリケーション サーバーです。32 ビットまたは 64 ビットの J9 JVM (IBM Technology for Java) で実行すると、メモリ リークの症状が発生します。
iSeries クラシック JVM、複数の Sun/Oracle JVM、および Linux JVM でこのソフトウェアを実行しても、問題は発生しないことに注意してください。ええと、私は自分のウェブサイトで作業している間、妻のエントリーレベルのラップトップで同じソフトウェアを一度に何週間も実行したままにしておくことが日常的にあります.
アプリケーションを構成せず (基本的にはメッセージング システムと Web サーバーのみ)、プレーン バニラ システムをアイドル状態のままにしておくと、ヒープはゆっくりと成長し続け、時間の経過とともにより多くのメモリが割り当てられ、各 GC サイクルは前のレベルまでかなり集めています。パターンは、GC スイープが常にヒープを以前の GC レベルに減らすことを除いて、問題のない JVM の場合とまったく同じです。
しかし、安定化後に起動時に JVM システム ダンプを取得し、割り当てられたヒープが大幅に増加した後に後続のダンプを取得すると、差分比較は、起動時よりも 1 週間実行した後、到達可能なオブジェクトがなくなったことを示します。1週間後の最新のものは、6つの追加のクラスがロードされ、それに明確に関連するいくつかのオブジェクトを示しています。すべての生きているオブジェクトの徹底的なレビューは、私が予想外に飛び出したものは何も示していません.
スループット最適化ガベージ コレクタと世代同時並行ガベージ コレクタを試しました。
そのため、ジョブのヒープ サイズによると、リークしているように見え、ヒープ ダンプによると、何もリークしていません。
呼び出される JNI メソッドはありません (コア JVM の一部として実行されるネイティブ コードを除く)。それは間違いなくヒープが成長していることです。コンソールで JMX Bean を使用して報告されるだけでなく、IBM WRKJVMJOB 情報でもそれを明確に確認できます。ログファイル。
これまでのところ、JVisualVM などの JMX ツールを使用してアクティブな JVM に接続することはできません。適切に構成されている場合はリッスン ソケットが作成されますが、明らかにプロトコル レベルで接続が拒否されるためです (TCP/IP スタックは受け入れられた接続を示しますが、 JVM がバウンスします)。
私は当惑し、次にどこへ行けばよいか途方に暮れています。
編集:明確にするために。これらの結果はすべて、インストルメント化されていない JVM を使用したものです。これは、この JVM への JMX アクセスを取得できないためです (IBM と協力して取り組んでいます)。
EDIT 2011-11-16 19:27: Soft/Weak/PhantomReference カウントの特定のカウントを含む 1823 GC サイクルにわたる GC アクティビティ レポートを取得できました。これらの数字が暴走する兆候はありません。ただし、小さなオブジェクトの保有スペースは大幅に増加しています (大きなオブジェクトの保有スペースは空です)。9M から 36M に成長しました。