2

JBoss で非常に奇妙な動作をしています。SO Crowd の集合的な知恵を利用したいと思います。

SOAP呼び出しを処理するためにJBoss(4.0.4だと思います)を使用しています。実際、これは栄光の RPC サーバーとして使用されており、それ以上のものではありません。20 以上のクライアントが同時にリクエストを送信すると、メモリが不足します。要求は、かなり小さな着信要求 (適切な SOAP) と、基本的に 1 つの長い SOAP 文字列 (文字列の内容は XML) である戻り結果パケットで構成されます。はい、これは最適ではないことを認識しています。聞かないでください。

400 万のオブジェクト (文字列と整数) を保持する org.jboss.axis.message.SAX2EventRecorder のインスタンスへのリークを追跡しました。現在、最長の応答でさえ 4MB のデータを伝送しません。要求はすべて 40K 未満です。何か怪しいところがありますが、Web でドキュメントが見つかりません。

レコーダーの用途を誰か教えてください。どうすればそれを取り除くことができますか?または、メモリをあまり消費しないように構成できますか? どんな助けでも大歓迎です。


更新: 明確にするために、メモリ ダンプを実行しました。ダンプには、配列または 4,000,000 以上のオブジェクト、文字列、および整数が表示されます。配列は org.jboss.axis.message.SAX2EventRecorder によって所有され、次の担当者によって保持されます。

org.jboss.axis.message.SOAPEnvelopeAxisImpl@0x19c31fd8 (141 バイト): フィールドレコーダー org.jboss.axis.message.RPCParamElementImpl@0x19c32260 (123 バイト): フィールドレコーダー) : フィールドレコーダー org.jboss.axis.message.RPCElement@0x19c321e0 (124 バイト) : フィールドレコーダー org.jboss.axis.encoding.DeserializationContextImpl@0x19c332f0 (67 バイト) : フィールドレコーダー org.jboss.axis.message.SAX2EventRecorder$ objArrayVector@0x19c33398 (24 バイト) : フィールド this$0

私たち自身のアプリのデータ構造はかなり肥大化していますが、この程度ではありません。

別の更新: 「解決策となる力」を見つけた力: 64 ビット メモリに切り替えています。万歳。

4

2 に答える 2

11

JVM 引数 -XX:-HeapDumpOnOutOfMemoryError で実行します。これにより、メモリが不足したときにヒープ ダンプが得られます。その後、 jhatツール (JDK に付属) を使用してヒープ ダンプを分析できます。または、jconsoleツール (JDK にも付属) を使用して、メモリ管理 MBean を使用していつでもヒープ ダンプを要求できます。

これらの 400 万個のオブジェクトに実際に何が含まれているかがわかります。これにより、ソフトウェアがそのメモリを解放しない理由についての洞察が得られる可能性があります。

編集:

この問題を抱えているのはあなただけではないようです。Axis に提出された 2 つのバグ レポートがあります。

AXIS-2698

AXIS-2749

AXIS-1771も参照してください。デシリアライゼーションとその影響を仲介する方法に関する興味深い情報があります。どのバージョンの Axis を使用していますか?

于 2009-01-27T13:35:51.253 に答える