2011-09-05 67 views
2

在我的應用程序中,我比較兩個docx文件並創建一個html比較文件,當我嘗試使用低於150或170行的文件時,則沒有問題,而我嘗試比較大文件像200行或以上,那麼這時它顯示使用docx4j進行docx比較時出現OutOfMemoryError

java.lang.OutOfMemoryError: Java heap space error, 

可以任何人請幫助嗎?

+0

您爲java運行時允許多少內存空間?嘗試增加內存:) – ykatchou

+1

請指定更多的細節,如你正在使用什麼方法(基於緩衝或基於流或基於通道) – Santosh

+0

我已經嘗試增加tomcat catalina.bat文件中的jvm大小,現在我給了512m,並且我我使用javax.xml.transform.stream.StreamResult這個類並使用HtmlExporterNG2類再次將比較文檔轉換爲html文件。 – bala

回答

2

您正在運行內存,因爲你沒有使用Docx4jDriver類,它通過首先執行段落級別差異來使差異問題變得更容易處理。

使用它,像這樣:

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

我改變了我的代碼,現在我正在使用Docx4jDriver,我正在做段落級別的比較,但它仍然在150行之前顯示了330行之後的堆內存錯誤。 – bala

0

可以使堆空間較大與-Xmx和-Xmx爲VM參數

這裏更多關於Heap Size Tuning或這裏Heap size

+0

我已經嘗試增加tomcat catalina.bat文件中的jvm大小,現在我給了512m,並且使用javax.xml.transform.stream.StreamResult這個類並使用HtmlExporterNG2類再次將對比文檔轉換爲html文件 – bala

+0

嘗試它與700米? – Neifen

+0

對不起,我也試過用1024m,仍然是同樣的問題 – bala

0

嘗試增加使用命令行參數-Xms<minimum heap size> Java堆大小-Xmx<maximum heap size>和。

在你的代碼,測試

也是你確實有下列增加堆大小:

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

做這個排隊叫號Differencer.diff前117

0

嘗試剖析應用程序,而不是使假設或智能猜測。您可以使用隨Jdk一起提供的visualvm或控制檯。另外,你可以使用jmap將你的應用程序的堆轉儲,然後使用jhat或eclipse mat(我更喜歡這個,谷歌它)看看消耗內存和尋找任何不尋常的行爲。

相關問題