2014-12-04 83 views
1

我想我在使用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的等效選項是什麼?

+0

有JVM選項,允許收集未使用的類和免費的permgen。嘗試谷歌爲它 – talex 2014-12-04 15:21:09

+0

[[-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

回答

1

問題解決了。我從來沒有想過內存泄漏的地方,但我注意到,在控制檯中,maven會爲surefire啓動,但從未包含我通過<argLine>傳遞的參數。當我加入了相同的參數,以maven的命令:

MVN測試-DargLine = 「 - XX:MaxPermSize參數=1024米-Xmx768m」

所有測試執行的罰款,沒有內存不足的問題。所以我認爲<argLine>元素可能無法正常工作。

+1

我們已經在根POM永久添加此選項: ' org.apache.maven。插件 行家-萬無一失-插件 <結構> -XX:MaxPermSize參數=1024米-Xmx768m ' – Stefan 2016-04-11 13:08:38