maven中的OutOfMemoryError和GC开销限制,但不是eclipse

pet*_*ust 4 java eclipse garbage-collection out-of-memory maven

我正在开发一个程序来处理PDF和SVG文档(几兆字节),并且可以在Eclipse(Windows)上成功运行应用程序,其中包含一些包含多个文档的循环.根据Windows任务管理器,它似乎没有为每个文档占用更多内存,并使用不到1 GB.但是在Maven上,它会为第一个文档抛出OOME或GC开销(典型的surefire报告,并不总是在同一个地方失败).

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)
Run Code Online (Sandbox Code Playgroud)

我已阅读了大量的SO答案,并在Windows环境变量中设置了MAVEN_OPTS

C:\Users\pm286\workspace\svg2xml-dev>echo %MAVEN_OPTS%
-Xmx2048m -XX:+UseGCOverheadLimit
Run Code Online (Sandbox Code Playgroud)

为什么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"
Run Code Online (Sandbox Code Playgroud)

日食:

Version: Indigo Release
Build id: 20110615-0604
Run Code Online (Sandbox Code Playgroud)

Mat*_*ias 8

Surefire通常在自己的VM中运行,不使用maven opts内存设置.

请参阅此处了解如何调整surefire内存设置:surefire插件

所以你要做的就是基本上调整你的pom来设置surefire插件的内存设置.

由于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>
Run Code Online (Sandbox Code Playgroud)