OutOfMemoryError mentre si fa il confronto docx utilizzando docx4j
Domanda
nella mia domanda mi sto paragonando due file docx e la creazione di file di confronto uno html, quando ho provato con sotto dei 150 o 170 righe del file, quindi non c'è alcun problema, mentre cerco di confrontare i file di grandi dimensioni come 200 linee o superiore che poi quel tempo mostra la
java.lang.OutOfMemoryError: Java heap space error,
Può uno aiuto per favore su questo?
Soluzione
Si esegue fuori la memoria, perché non si utilizza la classe Docx4jDriver, che rende il problema diff più trattabile facendo un diff livello di paragrafo prima.
Usa in questo modo:
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);
Altri suggerimenti
è possibile rendere lo spazio più grande con heap -Xmx e Xmx come argomenti VM
Qui di più su Dimensione heap sintonia o qui Mucchio dimensioni
Provare ad aumentare la dimensione heap Java utilizzando la riga di comando argomenti -Xmx<maximum heap size>
e -Xms<minimum heap size>
.
Anche nel codice, prova che in realtà hanno aumentato la dimensione heap con la seguente:
long heapSize = Runtime.getRuntime().totalMemory();
System.out.println("Heap Size = " + heapSize);
Fate questo prima di chiamare Differencer.diff
on line 117.
Prova profiling la vostra applicazione, piuttosto che fare ipotesi o congettura intelligente. È possibile utilizzare VisualVM o console che viene fornito con JDK.
Inoltre, si può prendere un heap dump della vostra applicazione utilizzando jmap e quindi utilizzare jhat o eclisse mat (preferisco questo, google out) per vedere che cosa sta consumando la memoria e guardare fuori per qualsiasi comportamento insolito.