【问题标题】:Maven Cobertura OutOfMemoryErrorMaven Cobertura OutOfMemoryError
【发布时间】:2011-01-04 03:43:30
【问题描述】:

我正在使用 Maven site:run 来生成 cobertura 代码覆盖率...

以下是我对 cobertura 的 pom.xml 配置:

<reporting>
    ...
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
            <version>2.3</version>
        </plugin>
    </plugins>
</reporting>

但是,我在站点结束时收到 OutOfMemoryError:运行。请建议如何摆脱这个错误。 (我已经尝试了所有这些 -Xmx、-XX 选项......)

Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
        at sun.reflect.GeneratedSerializationConstructorAccessor74.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:924)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1737)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
        at java.util.HashMap.readObject(HashMap.java:1030)
        at sun.reflect.GeneratedMethodAccessor347.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
        at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:480)
        at net.sourceforge.cobertura.coveragedata.CoverageDataContainer.readObject(CoverageDataContainer.java:373)
        at sun.reflect.GeneratedMethodAccessor348.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
        at java.util.HashMap.readObject(HashMap.java:1030)
        at sun.reflect.GeneratedMethodAccessor347.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)

【问题讨论】:

标签: maven-2 maven out-of-memory cobertura


【解决方案1】:

在你的 pom.xml 中使用这个属性:

<project>
...
<build>
...
</build>

<properties>
    <cobertura.maxmem>256M</cobertura.maxmem>
</properties>

</project>

【讨论】:

  • 我明白了!在 pom.xml 中添加 512m 解决了我的问题。谢谢大家
  • 然后考虑投票并接受 Jean-Philippe Briend 的回答。
【解决方案2】:

您是否尝试过export MAVEN_OPTS=-Xmx1024m(或与您的机器匹配的最高值)之类的方法?

如果您仍然没有足够的内存来运行 maven,那么我建议您尝试禁用其他插件并从测试覆盖范围中排除一些类,以检查它是否真的是内存问题。

<plugin>
 <groupId>org.codehaus.mojo</groupId>
 <artifactId>cobertura-maven-plugin</artifactId>
 <configuration>
  <instrumentation>
    <ignores>
      <ignore>com.example.boringcode.*</ignore>
    </ignores>
    <excludes>
      <exclude>com/example/dullcode/**/*.class</exclude>
      <exclude>com/example/**/*Test.class</exclude>
    </excludes>
  </instrumentation>
</configuration>

http://mojo.codehaus.org/cobertura-maven-plugin/usage.html

编辑

其他想法:

设置以下属性(见cobertura plugin properties

-Dmaven.cobertura.report.maxmemory=xxx
-Dmaven.cobertura.instrumentation.maxmemory=xxx

尝试使用 fork 或通过以下方式增加内存。我不确定它是否适用于 cobertura,但似乎适用于 junit。来自page的片段:

<plugin>
...
<configuration>
<forkMode>pertest</forkMode>
</configuration>
</plugin>

<plugin>
...
<configuration>
...
<argLine>-Xmx512m -XX:MaxPermSize=256m</argLine> 
</configuration>
</plugin>

【讨论】:

  • 这是我的 MAVEN_OPTS:-XX:MaxPermSize=512m -Xms128m -Xmx600m(我将其更改为 -Xmx1024m 但出现以下错误:VM 初始化期间发生错误无法为对象保留足够的空间heap 无法创建 Java 虚拟机。)
  • 嗨 ewernli,我试过了,但问题仍然存在......这是我在 pom.xml 中所做的更改:(我排除了最大的包)com/ xxx/**/*Test.classcom/xxx/yyy/rating/**/*.classcom/xxx/yyy/common/**/*.类
  • 我明白了!在 pom.xml 中添加 512m 解决了我的问题。谢谢大家!
猜你喜欢
  • 2010-11-03
  • 2012-01-07
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2012-03-13
  • 2014-10-26
  • 2013-02-20
相关资源
最近更新 更多