1. 程式人生 > >記憶體溢位導致jenkins自動部署到tomcat失敗

記憶體溢位導致jenkins自動部署到tomcat失敗

原文地址:http://openwares.net/java/jenkens_deploy_to_tomcat_error_of_outofmemoryerror.html

jenkins自動部署war到tomcat 7應用伺服器時很不穩定,經常出現錯誤:

1234567ERROR: Publisher hudson.plugins.deploy.DeployPublisher aborted due to exceptionorg.codehaus.cargo.container.ContainerException: Failed to deploy [/var/lib/jenkins/jobs/devel_auto_build_deploy/workspace/build/libs/reis
.war]...Caused by: org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: FAIL - Encountered exception javax.management.RuntimeErrorException: Error invoking method check...org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: FAIL - Encountered exception javax.management.RuntimeErrorException: Error invoking method check
...

tomcat日誌可以看到如下異常:
堆空間記憶體不足

1java.lang.OutOfMemoryError: Java heap space

永久代記憶體不足

12345SEVERE: Exception invoking method checkjava.lang.OutOfMemoryError: PermGen space...Exception in thread "http-bio-8080-exec-38" java.lang.OutOfMemoryError: PermGen spaceOpenJDK 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated

出現此問題的原因是tomcat預設配置的堆和非堆記憶體都太小了,需要調整如下JVM記憶體配置引數:

    • -Xms

初始堆記憶體大小

    • -Xmx

最大堆記憶體大,一般設定-Xms與-Xmx一樣大小,根據應用型別和實體記憶體大小來決定二者的大小

    • -Xmn或者-XX:NewSize

堆記憶體中年輕代的大小

    • -XX:PermSize

永久代記憶體的初始大小

    • -XX:MaxPermSize

永久代記憶體的最大值

一般設定這幾個引數也就夠了,debian系統上tomcat 7 設定JVM的記憶體引數要在配置檔案/etc/default/tomcat7中的JAVA_OPTS引數中設定。

一個web app,伺服器實體記憶體16G,其設定如下:

1JAVA_OPTS="-Djava.awt.headless=true -Xmx5120m -Xms5120m -Xmn1024m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:+UseConcMarkSweepGC"