maven java.lang.OutOfMemoryError: PermGen space

問題:同事的一個工程最近幾天使用mvn test跑單元測試迴歸時,每天都會報“org.apache.maven.surefire.booter.SurefireExecutionException:PermGen space; nested exception is java.lang.OutOfMemoryError: PermGen space”這個錯誤。

        拿到問題後,我第一想法就是讓他去maven_home/bin目錄下的mvn文件中增加MAVEN_OPTS參數來調整PermGen的大小,給了她這個設置:MAVEN_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128m-XX:MaxPermSize=128m。由於這個問題也是偶發,改了之後的兩天,確實沒有再重現了。但第三天,她又給了我一樣的報錯截圖....

         於是糾結了......沒有思路.......

         然後,無意中發現一個現象,當我執行mvn test的時候,通過ps -ef | grep java查看當前機器運行的的java進程,發現除了執行maven主程序的java進程,伴隨的還有一個帶了很多surefire字樣的java進程,之前只見過maven有一個surefire這個名字的插件,但一點都不熟悉。這時馬上有一個懷疑:單元測試類不是在maven的主進程中執行的,所以我加了MAVEN_OPTS之後執行測試時PermGen還是內存不足。於是去搜了一下,看到了這個帖子:http://www.cnblogs.com/discuss/archive/2010/10/27/1862225.html,有了結論:在執行mvn test時,maven會啓動一個fork進程來運行所有的單元測試類,所以我需要設置的是這個fork進程的jvm參數。

         這個參數配置也不好找,網上有一片surefire參數配置的文章,但是裏面沒有提到如何配置jvm啓動參數,情急之下我還找了surefire開發人員郵件組,用蹩腳英文寫了封郵件,過了一會又回信,開心了一把,打開一看,是系統退信…..

         不過最終還是讓我找到了http://maven.apache.org/plugins/maven-surefire-plugin/examples/system-properties.html這個地址,在這篇文章的最末尾,看到了<argLine>….</argLine>的配置,於是在單元測試的工程中加了插件的配置,如下所示:

 

這裏的配置還有一個provider配置的問題,默認情況下surefire會根據工程中junit的版本來選擇provider等,具體的解釋可以看:http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html

問題解決了之後倒是冒出關於這個插件更豐富的配置的文章:http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html,在這裏甚至發現了一個forkMode的參數,原來運行mvn test也不是一定要啓動另外一個fork進程的,通過forkMode可以修改這個配置,forkMode默認值是once,這個配置會啓動一個新的jvm fork進程用來跑單元測試,把forkMode參數設置成never,單元測試跑的時候就會由maven的主進程來跑了,也就是說這時候再通過MAVEN_OPTS來進行設置jvm參數也是可以行得通的了。


原文地址:http://zhan.renren.com/thisjava?gid=3602888498034590469&checked=true





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章