安装好Jenkins并创建Maven项目之后,开始进行Build,结果程序立马死掉并出现下面的PermGen space错误。
查看日志也是 java.lang.OutOfMemoryError: PermGen space 错误,典型的内存溢出错误,很简单,加大jvm的内存,但是没想到开始了下面曲折的解决之路:
开始是将Jenkins扔到tomcat下面的,于是先在tomcat安装目录的bin目录下面执行 service.bat install
命令将Tomcat安装成Windows服务,然后运行 tomcat7w 设置jvm的内存,然后启动,但是开始building依然出错;
然后在Jenkins的Configure System中设置全局的 MAVEN_OPTS 为 -Xmn128m -Xms1024m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=518m
,重启Jenkins运行building,依然报上面的错误;
于是想到是不是直接使用mvn命令在项目下面运行是否可以,于是进入到项目根目录下面执行 mvn clean install
果然出现了几个错误,逐一解决掉之后继续重启Jenkins并运行building,虽然错误的界面不同,但依然界面挂起然后进程占用CPU;
又想到是不是tomcat的内存设置的没有生效,于是安装了Monitoring插件运行之后设置的内存是生效的;后来又想到是不是把tomcat和maven的jvm内存都设置的太大了,在一起启动不起来,于是调低了内存并使用 java -Xmn128m -Xms1024m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=518m -version
逐一进行测试,依然如故。
在这个过程中发现了两个特点:一是执行svn的时候没有问题,只要一执行mvn命令就会死在原界面;二是每次挂起的时候tomcat整个也无法运行了。于是先将Jenkins安装成一个独立的程序,然后在jenkins.xml文件中设置jvm内存,并独立启动再运行依然出现错误。
偶然间在jenkins数据目录(默认为USER_HOME/.jenkins)下面查看job的日志,突然出现了一个 java -e -B -Dmaven.test.skip=true -Xmn128m -Xms1024m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=518m ... 的日志,后来等了一会儿就消失了,然后出现PermGen space错误,于是想到怎么Jenkins将mvn的参数当作了jvm参数,于是发现在项目中将 -e -B -Dmaven.test.skip=true
参数放在了项目的 MAVEN_OPTS 参数中,原来应该向下面这样放在 Golas and options 里面:
最后运行building,速度很快并成功了。原来前面设置好jenkins(或java web容器)和maven的jvm内存就可以了,只是因为将mvn的参数误设置到了 MAVEN_OPTS 中,但很奇怪依然产生了PermGen space错误。
参考资料:
Builds failing with OutOfMemoryErrors
How do I increase memory on Tomcat 7 when running as a Windows Service?