java service wrapper 级别为info导致内存剧增直至溢出
2016-10-24 16:46
225 查看
上周,公司某一环境发生java service wrapper内存剧增导致最后被自动killed的情况,经过分析,确定导致java service wrapper(后续简称wrapper)守护进程内存快速增长直至被killed的最根本原因是应用程序到mysql数据库的jdbc可用连接远远小于java应用并发线程数,导致报了很多的连接异常(这些异常在至少三种情况下会发生:应用程序启动时mysql未启动,应用程序启动期间mysql被正常或异常关闭,mysql负载过高无响应或者超时,三者均可重现wrapper内存无限增长直至溢出),无论是dbcp 1.x,2.x还是c3p0,该问题均会发生,这些未被捕获的异常堆栈被传递到了wrapper守护进程,进而导致wrapper进程内存激增而溢出。而这些错误仅仅会在wrapper的日志级别为INFO或者更低时会被传递给wrapper;如果设置为ERROR或者更高,则不会(至于为何在这种情况下错误堆栈会被传递给wrapper,尚未找到具体的原因)。它与应用程序设置的log4j级别并无直接关系。同时dbcp连接池1.4以及以下版本因对无效的连接自动回收存在bug,会加速该问题的发生。
PS:上述问题仅在出问题的环境centos 7.0.1406版本下wrapper 3.5.29已验证可重现,不保证在其他版本下一定可重现。
解决方法:
1、使用wrapper,需设置conf/osm-runtime.conf中下列参数为ERROR:
wrapper.console.loglevel
wrapper.logfile.loglevel
wrapper.syslog.loglevel
这么更改的副作用是后续主应用程序中的异常将被suppressed,事后无法查找非显示打印的异常。
2、使用tomcat或者其他应用程序比如自己编写shell脚本作为主容器。
建议:统一将jdbc连接池调整为dbcp 2.1.1。
PS:上述问题仅在出问题的环境centos 7.0.1406版本下wrapper 3.5.29已验证可重现,不保证在其他版本下一定可重现。
解决方法:
1、使用wrapper,需设置conf/osm-runtime.conf中下列参数为ERROR:
wrapper.console.loglevel
wrapper.logfile.loglevel
wrapper.syslog.loglevel
这么更改的副作用是后续主应用程序中的异常将被suppressed,事后无法查找非显示打印的异常。
2、使用tomcat或者其他应用程序比如自己编写shell脚本作为主容器。
建议:统一将jdbc连接池调整为dbcp 2.1.1。
相关文章推荐
- java service wrapper导致内存剧增直至崩溃
- Java之JVM调优案例分析与实战(3) - 堆外内存导致的溢出错误
- Java堆外内存及导致的溢出错误
- c/c++ error:GetAdaptersInfo调用失败后重复调用,导致内存溢出
- cached过高导致内存溢出 java head space
- Java中,String的subString方法易导致内存溢出
- mark/reset方法的使用以及导致内存溢出的原因(java)
- Java之JVM调优案例分析与实战(2) - 集群间同步导致的内存溢出
- java-subString方法易导致内存溢出
- Java中subString和split导致的内存溢出和对策
- java 程序内存溢出问题查找
- Squid 开启大内存导致进程内存溢出解决方法
- 不同平台下处理【java.lang.OutOfMemoryError: Java heap space】内存溢出。
- 第2章 Java内存区域与内存溢出异常--《深入理解 Java 虚拟机》笔记
- java 程序内存溢出问题查找
- java内存管理的一些基础,内存溢出的解决方案
- xp系统不设置默认邮件软件,导致浏览器不断启动直至内存耗尽。
- Java常见的内存溢出异常及解决方法
- SSH整合遇难到的非堆内存溢出问题java.lang.OutOfMemoryError: PermGen space
- java用Socket实现的远程桌面浏览 内存溢出问题