讨论:TOMCAT一直内存溢出,有什么好的解决办法(顶者有分)

antony0203 2008-01-15 09:51:16
我们的系统正式上线后,使用人一多,就经常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。


这里各位有经验的朋友希望能发表你们的看法,提出更好的建议,谢啦!
...全文
4192 45 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
Decmond 2011-11-25
  • 打赏
  • 举报
回复
我的一个项目中,也遇到了,是一个财务系统,是通过一个url来读取相应的数据,存储到相应的数据库表中,

生成了四个jar包,但其中jar包的xml配置的url 不同,其前三个是能够读取数据,但执行第四个jar包时,就出

现了楼主的问题,后来在cmd中执行了java -jar - Xmx1024m -Xms512m jar文件

这个应用是部在某所大学上的,其中第四个jar包执行时,会获取5W条的数据量。
vinalice 2011-06-09
  • 打赏
  • 举报
回复
可修改Catalina.bat里面的内存大小
antony0203 2008-02-03
  • 打赏
  • 举报
回复
问题还没解决,不过先结贴了
guoqiangone 2008-02-02
  • 打赏
  • 举报
回复
up
manlibie 2008-01-29
  • 打赏
  • 举报
回复
考虑并发的数量问题啊!
manlibie 2008-01-29
  • 打赏
  • 举报
回复
内存泄露问题
zdblzwj 2008-01-29
  • 打赏
  • 举报
回复
这么多人回答...
我也说点个人意见,前段时间公司一项目设计查询大量数据,造成数据库的CPU使用率过高,导致网页无法访问了,和你的问题好像有些出入,经高手指点我的问题可以用索引解决

帮顶...JF
guoqiangone 2008-01-29
  • 打赏
  • 举报
回复
session用的多吗?
注意session打开了要关闭
little06 2008-01-28
  • 打赏
  • 举报
回复
查看代码
加大tomcat使用的内存
用jprofile跟踪服务端,客户端压力测试
diamond_fish 2008-01-28
  • 打赏
  • 举报
回复
还有一个办法,lsof看看这个程序到底打开了哪些文件,可能读入了非常大的文件
ruanliang 2008-01-28
  • 打赏
  • 举报
回复
应该是写的程序查询量太大,冗余过多.检查下程序吧
消失风雨中 2008-01-28
  • 打赏
  • 举报
回复
在J道上看到过类似的问题,楼主可以去那看看
hxj1225 2008-01-25
  • 打赏
  • 举报
回复
是不是用完的链接没有关闭或者没有放回连接池?
hxj1225 2008-01-25
  • 打赏
  • 举报
回复
关注,学习
liuchuntao 2008-01-25
  • 打赏
  • 举报
回复
这种情况应该是程序有问题,建议检查程序代码。
antony0203 2008-01-23
  • 打赏
  • 举报
回复
请教个脚本
脚本方案:访问本机WEB;如果不响应就再试两次然后过滤出TOMCAT PID杀掉再重新启动TOMCAT。
或者是每天定时晚上12点重起

哪位熟悉脚本的教教我,谢了
gameboy911 2008-01-23
  • 打赏
  • 举报
回复
up
waterborn 2008-01-21
  • 打赏
  • 举报
回复
程序问题.
不用DBCP ,换C3P0 ,proxool 试试.
Ailen5 2008-01-21
  • 打赏
  • 举报
回复
1.数据库记录信息太多
2.方法中的session是否关闭
3.数据查询时,尽量不要全部查询出
antony0203 2008-01-21
  • 打赏
  • 举报
回复
有什么临时解决方法?
加载更多回复(22)

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧