[英]Running Cobertura with PowerMockito throwing java.lang.OutOfMemoryError: PermGen space
如何使用powermockito + cobertura解决内存不足 / PermGen空间问题。
当我在测试用例上运行mvn cobertura:cobertura
,出现如下异常:
Exception in thread "Thread-14" java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(Mock
ClassLoader.java:250)
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(Mock
ClassLoader.java:194)
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(D
eferSupportingClassLoader.java:71)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at net.sourceforge.cobertura.coveragedata.ProjectData.getOrCreateClassDa
ta(ProjectData.java:88)
at net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesOnP
rojectData(TouchCollector.java:109)
at net.sourceforge.cobertura.coveragedata.ProjectData.saveGlobalProjectD
ata(ProjectData.java:272)
at net.sourceforge.cobertura.coveragedata.SaveTimer.run(SaveTimer.java:3
3)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-5" java.lang.OutOfMemoryError: PermGen space
at net.sourceforge.cobertura.coveragedata.ProjectData.addClassData(Proje
ctData.java:64)
at net.sourceforge.cobertura.coveragedata.ProjectData.getOrCreateClassDa
ta(ProjectData.java:89)
at net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesOnP
rojectData(TouchCollector.java:109)
at net.sourceforge.cobertura.coveragedata.ProjectData.saveGlobalProjectD
ata(ProjectData.java:272)
at net.sourceforge.cobertura.coveragedata.SaveTimer.run(SaveTimer.java:3
3)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-22" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-15" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-6" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-11" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-10" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-7" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-13" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-3" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-12" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-1" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-2" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-24" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-0" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-4" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-8" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-25" java.lang.OutOfMemoryError: PermGen space
我尝试通过使用下面的cobertura属性添加最大内存,如cobertura-mojo中所述 :
<cobertura.maxmem>1024m</cobertura.maxmem>
但是它没有按预期工作,我可以看到在PowerMock存储库中几乎没有未解决的问题Issue-227 , Issue-520 ,
我尝试通过使用以下注释来添加忽略包,但是如果测试类的数量更多,它将无法正常工作。 @PowerMockIgnore({"com.package.*"})
pom.xml
<dependencies>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.5</version>
<scope>test</scope>
</dependency>
</dependencies>
</build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Xmx1624m</argLine>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
<!--<argLine>-Xmx600m -XX:+HeapDumpOnOutOfMemoryError</argLine> -->
<forkCount>10</forkCount>
<reuseForks>true</reuseForks>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<quiet>true</quiet>
<cobertura.maxmem>1024m</cobertura.maxmem>
<instrumentation>
<maxmem>1024m</maxmem>
</instrumentation>
<!-- <argLine>-Xms512m -Xmx2048m -XX:MaxPermSize=1024m</argLine> -->
<!-- <argLine>-Xmx2048m</argLine> -->
</configuration>
<executions>
<execution>
<id>clean</id>
<phase>pre-site</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
<execution>
<id>instrument</id>
<phase>site</phase>
<goals>
<goal>instrument</goal>
<goal>cobertura</goal>
</goals>
</execution>
</executions>
</plugin>
.......
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<!-- using mvn cobertura:cobertura to generate cobertura reports -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
</configuration>
</plugin>
</plugins>
</reporting>
请让我知道是否有任何解决方法。
请在pom.xml的maven-surefire-plugin
中添加<version>2.19.1</version>
,它应该可以正常工作。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<argLine>-Xmx1624m</argLine>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
</configuration>
</plugin>
我想给您一些解决问题的建议。
"-XX:PermSize"
和"-XX:MaxPermSize"
。 JVM default size of Perm Space is around "64MB"
,如果您的项目中有太多的类或大量的String,则很容易耗尽内存。 要记住的重要一点是,它不依赖于-Xmx值,因此,无论总堆大小有多大,都可以在烫发空间中运行OutOfMemory。 不错的想法是,您可以根据项目需要使用JVM选项"-XX:PermSize"
和"-XX:MaxPermSize"
指定永久生成的大小。 "java.lang.OutOfMemoryError: PermGen"
另一个原因是通过类加载器的内存泄漏,它经常出现在WebServer和应用服务器中,例如tomcat,webshere,glassfish或weblogic。 PermGen空间中OutOfMemoryError的另一个原因是,当您取消部署应用程序时,是否没有退出由应用程序启动的任何线程
应用。
JVM_ARGS="-XX:PermSize=64M -XX:MaxPermSize=256m"
哪里
-XX:PermSize<size> - Set initial PermGen Size.
-XX:MaxPermSize<size> - Set the maximum PermGen Size.
正如@Alexander提到的那样,您遇到的问题是永久存储空间(存储静态对象,类信息等的内存区域)用光了。 和-Xmx设置处理堆空间。
您要设置MaxPermSize,如@Alexander所述:
-XX:MaxPermSize=1024m
另一个选择是升级到JDK 8,它将不再支持永久代,而支持MetaSpace。
只需在pom.xml中用-XX:MaxPermSize=1024m
取消注释该行。
在使用glassfish服务器的Web项目中,我遇到了类似的问题。 这是因为我正在读取整个表,该表一次包含大约600000行数据和大约50列。 我终于通过批量读取来解决此问题,这不仅解决了java.lang.OutOfMemoryError: PermGen
空间错误,而且在性能上也有了很大的提高。
可能是您穿着同一双鞋,即使是这种情况,即使将烫发尺寸增加到4096,在将来的某个时候仍然会遇到相同的问题。
您可以检查: JPA:对大型结果集进行迭代的正确模式是什么? 看看如何在jpa中实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.