Jenkins上的PowerMock发生内存泄漏
我想我在使用Jenkins执行单元测试时出现内存泄漏。如果我尝试执行超过60个单元测试,我开始使用java.lang.OutOfMemoryError: PermGen space
获得大多数测试失败。通常(但并非总是如此),堆栈跟踪似乎开始于或接近org.powermock.core.classloader.MockClassLoader
,尽管它不一致。在Maven的万无一失插件配置是非常简单的:Jenkins上的PowerMock发生内存泄漏
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18</version>
<executions>
<execution>
<phase>test</phase>
<configuration>
<reuseForks>false</reuseForks>
<argLine>-XX:PermSize=512m -XX:MaxPermSize=1024m</argLine>
</configuration>
</execution>
</executions>
</plugin>
在詹金斯,MAVEN_OPTS也设置为-XX:MaxPermSize=1024m
。
我看到一些文件表明它可能与我使用旧版powermock的事实有关,所以我升级到1.6.0,但我仍然遇到此错误。
我无法在本地重现问题,它似乎只发生在Jenkins服务器上。
我不知道如何可靠地解决这个问题:限制执行的测试用例的数量似乎正常,但是我有150个以上的测试用例在服务器上一次执行和执行50个批次的测试似乎不是一个很好的解决方案。我可能会给它更多的内存,但它似乎已经足够了,我不认为当它在本地运行时surefire需要那么多的内存。可能有一种方法可以与其他一些绝对的设置一起玩,但我不确定我需要调整哪些,或者如何调整。有没有其他人看到过这个,或者有如何解决它的建议?
这可能是相关的:开发环境是IBM的RAD和工作区与选项-Xgcpolicy:gencon
,其中据我可以告诉是针对IBM的实现JVM的启动。可能这是单元测试运行正常的原因,当我从RAD运行maven,但不是来自詹金斯?如果是这样,詹金斯正在使用的标准(Oracle)JVM的等效选项是什么?
问题解决了。我从来没有想过内存泄漏的地方,但我注意到,在控制台中,maven会为surefire启动,但从未包含我通过<argLine>
传递的参数。当我加入了相同的参数,以maven的命令:
MVN测试-DargLine = “ - XX:MaxPermSize参数=1024米-Xmx768m”
所有测试执行的罚款,没有内存不足的问题。所以我认为<argLine>
元素可能无法正常工作。
我们已经在根POM永久添加此选项: '
有JVM选项,允许收集未使用的类和免费的permgen。尝试谷歌为它 – talex 2014-12-04 15:21:09
[[-Xgcpolicy:gencon'(generational collection)](http://www.ibm.com/developerworks/websphere/techjournal/1106_bailey/1106_bailey.html):[Java SE 6 HotSpot \ [ tm \]虚拟机垃圾收集调优,3.世代](http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#generations)提及_“从J2SE 1.2开始,虚拟机所具备的一些正在使用代收集结合不同的垃圾收集算法“_ – 2014-12-05 00:36:33