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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top