OutOfMemoryError mientras realiza una comparación DOCX usando DOCX4J
Pregunta
En mi aplicación, estoy comparando dos archivos DOCX y creando un archivo de comparación HTML, cuando probé con menos de 150 o 170 líneas de archivo, entonces no hay problema, mientras intento comparar los archivos grandes como 200 líneas o más que eso que eso. tiempo que muestra el
java.lang.OutOfMemoryError: Java heap space error,
¿Alguien puede ayudarlo en esto?
Solución
Se está quedando sin memoria porque no está utilizando la clase DOCX4JDRIVER, lo que hace que el problema Diff sea más manejable al hacer un nivel de párrafo Diff primero.
Úselo así:
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);
Otros consejos
Puede hacer que el espacio del montón sea más grande con -xmx y -xmx como argumentos de VM
Aquí más sobre Ajuste del tamaño del montón o aquí Tamano de la pila
Intente aumentar el tamaño del montón Java usando los argumentos de la línea de comandos -Xmx<maximum heap size>
y -Xms<minimum heap size>
.
También en su código, pruebe que realmente haya aumentado el tamaño del montón con lo siguiente:
long heapSize = Runtime.getRuntime().totalMemory();
System.out.println("Heap Size = " + heapSize);
Haz esto antes de llamar Differencer.diff
en línea 117.
Intente perfilar su aplicación en lugar de hacer suposiciones o suposiciones inteligentes. Puede usar VisualVM o consola que se envíe con el JDK.
Además, puede tomar un basurero de su aplicación usando JMAP y luego usar JHAT o Eclipse Mat (prefiero esto, Google It Out) para ver qué está consumiendo la memoria y buscar cualquier comportamiento inusual.