2013-08-30 40 views
4

我正在開發一個程序來處理PDF和SVG文檔(幾MB),並且可以在包含多個文檔的循環的Eclipse(Windows)上成功運行應用程序。根據Windows任務管理器,它似乎沒有爲每個文檔獲取更多的內存,並使用小於1 GB。然而,在Maven中,它會爲第一個文檔引發OOME或GC開銷(典型的surefire報告,並不總是在同一個地方失敗)。OutOfMemoryError和GC開銷限制在maven但不是eclipse

Tests run: 5, Failures: 0, Errors: 1, Skipped: 3, Time elapsed: 14.271 sec <<< FAILURE! 
testPDFAnalyzerDIR(org.xmlcml.svg2xml.analyzer.PDFAnalyzerTest) Time elapsed: 14.259 sec <<< ERROR! 
java.lang.OutOfMemoryError: Java heap space 
    at sun.nio.cs.UTF_8.newDecoder(UTF_8.java:49) 
    at java.lang.StringCoding$StringDecoder.<init>(StringCoding.java:116) 
    at java.lang.StringCoding$StringDecoder.<init>(StringCoding.java:108) 
    at java.lang.StringCoding.decode(StringCoding.java:167) 
    at java.lang.String.<init>(String.java:443) 
    at java.lang.String.<init>(String.java:515) 
    at nu.xom.Text.getValue(Unknown Source) 
    at org.xmlcml.graphics.svg.SVGElement.createSubclassedChildren(SVGElement.java:195) 

我已經通過一些SO答案的閱讀和我在Windows環境變量設置MAVEN_OPTS

C:\Users\pm286\workspace\svg2xml-dev>echo %MAVEN_OPTS% 
-Xmx2048m -XX:+UseGCOverheadLimit 

爲什麼Eclipse中不會失敗(似乎有足夠的內存),並沒有任何maven的進一步解決方法?我明白我不得不去尋找內存泄漏和其他低效率,但我想通過測試來獲得這個階段的正確操作,而不是性能。有沒有什麼辦法可以從程序中得到調試輸出,從而導致出色的報告,所以我可以告訴最近的歷史記錄?

Maven的細節:

C:\Users\pm286\workspace\svg2xml-dev>mvn -version 
Apache Maven 3.0.3 (r1075438; 2011-02-28 17:31:09+0000) 
Maven home: C:\Program Files\maven\bin\.. 
Java version: 1.6.0_24, vendor: Sun Microsystems Inc. 
Java home: C:\Program Files\java\jdk1.6.0_24\jre 
Default locale: en_GB, platform encoding: Cp1252 
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows" 

的Eclipse:

Version: Indigo Release 
Build id: 20110615-0604 
+1

神火通常在自己的虛擬機不使用Maven的選擇採用的內存設置運行。請參閱這裏以瞭解如何調整Surefire內存設置:http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html 由於eclipse通常以不同的方式做事,我希望他們在不調用自己的VM的情況下運行測試,或者以不同的方式使用內存設置。 – Matthias

+0

很高興它的工作,我會發布它作爲一個答案 – Matthias

回答

8

神火通常運行在自己的虛擬機不使用Maven的選擇採用內存設置。

看到這裏如何調整萬無一失的內存設置:surefire plugin

所以,你必須做的是基本適應你的POM中,爲保命插件設置內存設置。

由於eclipse通常以不同的方式做事,所以我期望他們在不調用自己的VM的情況下運行測試,或者以不同的方式使用內存設置。

OP另外:我現在POM包含:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.5</version> 
      <configuration> 
       <argLine>-Xmx1024m </argLine> 
      </configuration> 
     </plugin> 
相關問題