記憶體溢位導致jenkins自動部署到tomcat失敗
阿新 • • 發佈:2019-02-04
原文地址:http://openwares.net/java/jenkens_deploy_to_tomcat_error_of_outofmemoryerror.html
jenkins自動部署war到tomcat 7應用伺服器時很不穩定,經常出現錯誤:
1234567 | ERROR: Publisher hudson.plugins.deploy.DeployPublisher aborted due to exception org.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日誌可以看到如下異常:
堆空間記憶體不足
1 | java.lang.OutOfMemoryError: Java heap space |
永久代記憶體不足
12345 | SEVERE: Exception invoking method check java.lang.OutOfMemoryError: PermGen space ... Exception in thread "http-bio-8080-exec-38" java.lang.OutOfMemoryError: PermGen space OpenJDK 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,其設定如下:
1 | JAVA_OPTS= "-Djava.awt.headless=true -Xmx5120m -Xms5120m -Xmn1024m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:+UseConcMarkSweepGC" |