0

問題 - XML 文字列を解析するときに、メモリ使用率がプログラムで増加し続けます。

TCP ポートで XML ストリームをライブで受信しています。
私は Netty を使用して xml データを引き出し、次に XStream を使用して XML 文字列を逆シリアル化/非整列化して Java オブジェクト ツリーに入れます。

netbeans プロファイルを使用してメモリ消費を監視すると、時間の経過とともにヒープが増加し、最終的に JVM が OutOfMemory 例外をスローすることがわかります。コール スタックを追跡し、実行中のテストのスクリーンショットを添付しました。

XML文字列をJavaオブジェクトに逆シリアル化/非整列化すると、メモリ消費が発生しているようです。

解析を行うために XStream 内でさまざまなパーサーを試しました - XPP3、KXML、STAX。XStream の代わりに JAXB を非整列化することも試みました。どのパーサーを使用しても、問題は解決しません。

これまでにこれらのさまざまなパーサーをすべて試しましたが、同じ問題があります。

  xstream1 = new XStream(new KXml2Driver());
  xstream2 = new XStream(new StaxDriver());
  xstream3 = new XStream(new JDomDriver());
  xstream4 = new XStream(new Xpp3Driver());

前述したように、XStream の代わりに JAXB を非整列化しようとしましたが、それでも同じ問題です。

添付の画像を見ると、この Arrays.copyOfRange 呼び出しが char[] のすぐ下に表示されています....どのパーサーであっても、この呼び出しは常にトレースの一番上に表示されます。

この問題を修正またはアプローチする方法について完全に迷っています

PLS 注 - ファイルから XML を読み取っていません。小さな XML チャンクを含むデータのライブ ストリームを取得します。各チャンクを抽出して Java オブジェクトに変換し、さらに処理します

ありがとう A Netbeans Profiler を使用して取得されたメモリ消費データからの割り当てスタック トレース

4

2 に答える 2

1

Well, on the evidence you've shown us, the simplest explanation is that your JVM's heap is too small. Try adding an "-Xmx" option as described in the manual entry for the java command.

If that doesn't work, then you need to take a deeper look at what your application is doing:

  • Is there an upper bound on the size of these "small" XML chunks? Could you be getting a chunk that is bigger than you have allowed for?

  • Is your application's processing keeping stuff from each chunk in a long lived in-memory data structure? Can you place an upper bound on the size of that data structure? Perhaps by throwing stuff out? (Or by using "weak references" so that the GC will throw them out?)

  • Is your application leaking memory?

于 2012-07-08T01:03:20.770 に答える
1

上記の答えはしっかりしています。メモリ内のオブジェクト グラフは高価になる可能性があることだけを付け加えておきます。あなたの説明が理解できれば、多数の小さな XML チャンクを含む XML のストリームがありますか? SAX 構文解析は、パイプライン アプローチと共に、あなたの答えかもしれません。SAX パーサーは作業の各チャンクを見つけると、すべてのオブジェクトをメモリにプルすることなく、下流のプロセスに渡します。

于 2012-07-08T06:21:53.310 に答える