DOCX4Jを使用してDOCX比較を行う際のOutOfMemoryError
質問
私のアプリケーションでは、2つのDocxファイルを比較し、150行または170行のファイルで試したときに1つのHTML比較ファイルを作成しています。それが示す時間
java.lang.OutOfMemoryError: Java heap space error,
誰かがこれについて助けてください?
解決
docx4jdriverクラスを使用していないため、メモリが不足しているため、最初に段落レベルのdiffを実行することで、diffの問題がより扱いやすくなります。
そうするようにそれを使用してください:
Body newerBody = ((Document)newerPackage.getMainDocumentPart().getJaxbElement()).getBody();
Body olderBody = ((Document)olderPackage.getMainDocumentPart().getJaxbElement()).getBody();
// 2. Do the differencing
java.io.StringWriter sw = new java.io.StringWriter();
Docx4jDriver.diff( XmlUtils.marshaltoW3CDomDocument(newerBody).getDocumentElement(),
XmlUtils.marshaltoW3CDomDocument(olderBody).getDocumentElement(),
sw);
// 3. Get the result
String contentStr = sw.toString();
System.out.println("Result: \n\n " + contentStr);
Body newBody = (Body) org.docx4j.XmlUtils
.unmarshalString(contentStr);
他のヒント
VM引数として、-xmxと-xmxを使用してヒープスペースを大きくすることができます
詳細についてはこちら ヒープサイズのチューニング またはこちら ヒープサイズ
コマンドライン引数を使用してJavaヒープサイズを増やしてみてください -Xmx<maximum heap size>
と -Xms<minimum heap size>
.
また、コードでは、以下でヒープサイズを実際に増やしたことをテストしてください。
long heapSize = Runtime.getRuntime().totalMemory();
System.out.println("Heap Size = " + heapSize);
電話する前にこれを行います Differencer.diff
117行目。
仮定やインテリジェントな推測をするのではなく、アプリケーションをプロファイリングしてみてください。 jdkに出荷されるVisualVMまたはコンソールを使用できます。
また、JMAPを使用してアプリケーションのヒープダンプを使用してから、JHATまたはEclipse Mat(これを好む、Google It Out)を使用して、メモリを消費しているものを確認し、異常な動作に注意してください。
所属していません StackOverflow