Question

dans ma demande, je compare deux fichiers docx et la création d'un fichier de comparaison html, quand je l'ai essayé avec dessous de 150 ou 170 lignes de fichier, il n'y a pas de problème, alors que je tente de comparer les gros fichiers comme 200 lignes ou plus alors que ce temps indiquant les

java.lang.OutOfMemoryError: Java heap space error,

que peut aider s'il vous plaît à ce sujet?

Était-ce utile?

La solution

Vous exécutez de mémoire parce que vous n'utilisez pas la classe Docx4jDriver, ce qui rend le problème de diff plus traitable en faisant un niveau de paragraphe diff premier.

Utilisez-le comme suit:

        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);

Autres conseils

vous pouvez faire l'espace de tas plus grand avec -Xmx et -Xmx comme arguments VM

Voici plus sur Heap Taille Tuning ou ici taille Heap

Essayez d'augmenter la taille du tas Java en utilisant les arguments de ligne de commande -Xmx<maximum heap size> et -Xms<minimum heap size>.

Aussi dans votre code, le test que vous avez réellement augmenté la taille du tas avec les éléments suivants:

long heapSize = Runtime.getRuntime().totalMemory();
System.out.println("Heap Size = " + heapSize);

Faites ceci avant d'appeler Differencer.diff la ligne 117.

Essayez profiler votre application plutôt que de faire des hypothèses ou de façon intelligente. Vous pouvez utiliser visualvm ou une console qui est livré avec le JDK.

En outre, vous pouvez prendre une décharge de tas de votre application à l'aide jmap puis utilisez soit tapis de jhat ou éclipse (je préfère cela, Google it out) pour voir ce qui consomme de la mémoire et de regarder pour tout comportement inhabituel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top