13

システム テストでの最近の展開の後、サーブレットの 1 つが通常よりもはるかに大きな打撃を受け、メモリが上昇し始め、最終的に weblogic が停止することに気付きました。私のインターンは、非常に誇りに思っていましたが、メモリリークの原因を発見しました。

リクエストが来るたびに、次の行が呼び出されます。

JAXBContext jc = JAXBContext.newInstance(“ruby.oracle_servlet.schemas”);

何らかの理由で、オブジェクトがガベージ コレクションされることはありません。静的にして初期化した場所に移動すると、メモリリークはなくなりました。

私たちの開発者の別の 1 人は、スタンドアロン Java アプリケーションの while ループにその行だけを入れ、メモリがどんどん増えていくのを見ました。

そのオブジェクトがガベージコレクションされない理由を誰かが知っていますか?

ありがとう

4

2 に答える 2

8

使用している JAXB の実装とバージョンは? Java SE 6 に付属する参照実装を使用している場合、それは Metro ( https://jaxb.dev.java.net/ ) です。

メモリ関連のバグのいくつかを次に示します。

MOXy 実装 ( http://www.eclipse.org/eclipselink/moxy.php ) を使用している場合は、デバッグを手伝うことができます。

幸いなことに、JAXBContext はスレッドセーフであり、一度だけ作成して再利用する必要があります。JAXBContext を再利用すると、メモリ リークも解決されるようです。

詳細については、次を参照してください。

于 2010-08-27T14:06:32.107 に答える
1

はい、漏れです。このメソッドが呼び出されるたびに、クラス「ruby.oracle_servlet.schemas」がロードされます。

JAXBContext.newInstance(“ruby.oracle_servlet.schemas”)
于 2013-04-08T14:03:42.803 に答える