讨论:TOMCAT一直内存溢出,有什么好的解决办法(顶者有分)
我们的系统正式上线后,使用人一多,就经常down掉。出现的情况是点击网页,要么就是打不开,要么就是打开页面后,登不进去
查看服务器进程,java内存和cpu个占用百分之十几。
tomcat无法用./shutdown.sh去停掉服务,只能kill进程
查看日志,经常有内存溢出
溢出原因大多不相同,贴一些log如下
1月14号的
Exception in thread "Timer-0" java.lang.OutOfMemoryError: Java heap space
at oracle.jdbc.dbaccess.DBItem.clone(DBItem.java:153)
at oracle.jdbc.dbaccess.DBDataSetImpl._setRowItems(DBDataSetImpl.java:912)
at oracle.jdbc.dbaccess.DBDataSetImpl._definesRowCompleted(DBDataSetImpl.java:1116)
at oracle.jdbc.dbaccess.DBDataSetImpl.rowCompleted(DBDataSetImpl.java:2362)
at oracle.jdbc.driver.OracleStatement.doDefinesFromTypes(OracleStatement.java:1094)
at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2396)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2672)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:527)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:92)
at com.cea.security.web.listener.JavaTask.executeShedule(JavaTask.java:85)
at com.cea.security.web.listener.JavaTask.run(JavaTask.java:46)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
2008-1-14 16:42:15 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run
严重: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.tomcat.util.net.LeaderFollowerWorkerThread@274d1c, terminating thread
DEBUG (loger.java:49) - 2008-01-14 16:42:42 fullURI: /safeweb/login.jsp
DEBUG (loger.java:49) - 2008-01-14 16:35:124 fullURI: /safeweb/login.jsp
2008-1-14 16:42:15 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run
严重: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.tomcat.util.net.LeaderFollowerWorkerThread@274d1c, terminating thread
1月10号
2008-1-10 16:37:29 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run
严重: Caught exception (java.lang.OutOfMemoryError: GC overhead limit exceeded) executing org.apache.tomcat.util.net.LeaderFollowerWorkerThread@1715ab5, terminating thread
....
2008-1-10 17:56:58 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor processChildren
严重: Exception invoking periodic operation:
java.lang.OutOfMemoryError: Java heap space
2008-1-10 18:36:24 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run
严重: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.tomcat.util.net.LeaderFollowerWorkerThread@1715ab5, terminating thread
2008-1-10 18:36:24 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run
严重: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.tomcat.util.net.LeaderFollowerWorkerThread@1715ab5, terminating thread
java.lang.OutOfMemoryError: Java heap space
2008-1-10 19:05:55 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor processChildren
严重: Exception invoking periodic operation:
java.lang.OutOfMemoryError: Java heap space
Exception in thread "http-8080-Processor296" 2008-1-10 20:01:26 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run
严重: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.tomcat.util.net.LeaderFollowerWorkerThread@1715ab5, terminating thread
2008-1-10 20:01:26 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor processChildren
严重: Exception invoking periodic operation:
java.lang.OutOfMemoryError: Java heap space
2008-1-10 20:01:26 org.apache.tomcat.util.net.PoolTcpEndpoint processSocket
严重: Unexpected error processing socket
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
2008-1-10 20:14:07 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor processChildren
严重: Exception invoking periodic operation:
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
2008-1-10 20:14:07 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor processChildren
严重: Exception invoking periodic operation:
java.lang.OutOfMemoryError: Java heap space
目前-Xms512m -Xmx1024m
我觉得可能是程序的问题,但是我们是在别人公司的半成品上开发的,另一个team他们用这个半成品开发的项目也是几乎每天要重起一次,所以很可能问题在那家公司的那个平台上,而且就算是我们写的代码问题,现在去修改代码也不现实。最好有什么其它的解决方法。
网上也搜到几种方法,
一个是
写个脚本当tomcat使用的内存到一定比率时就自动重启它;设置为10分钟运行一次。
代码:
#!/bin/sh
#允许最大占用内存的百分比
ram_max=45
#服务程序所守候的端口
port=8180
#通过守候端口获取服务程序的pid
pid_ram=` netstat -nlp |grep $port|awk ’{ print }’|awk -F / ’{ print }’ `
#通过服务程序的pid获取当前占用的内存百分比
ram=` ps -aux |grep -m1 $pid_ram|awk ’{ print }’|awk -F . ’{ print }’ `
#调试程序用
#echo $port
#echo $pid_ram
#echo $ram
#echo $ram_max
#如果所占用的内存使用率大于所定义的值,则重启该服务程序
if expr $ram \>= $ram_max > /dev/null
then
#所要执行的动作
# echo 2
echo "8180 tomcat rebooted" >>/usr/local/tomcat-5.5.9/logs/autoreboot.log
echo `date` >>/usr/local/tomcat-5.5.9/logs/autoreboot.log
/usr/local/tomcat-5.5.9/bin/shutdown.sh
kill -9 $pid_ram
/usr/local/tomcat-5.5.9/bin/startup.sh
#调试程序用
#else
# echo 1
fi
第二个也是写个脚本
脚本方案:访问本机WEB;如果不响应就再试两次然后过滤出TOMCAT PID杀掉再重新启动TOMCAT。
这里各位有经验的朋友希望能发表你们的看法,提出更好的建议,谢啦!