最近的检验系统上线一段时间后,发现系统访问不了,tomcat总是会自动崩掉,一般遇到这种问题,程序员的第一反应都肯定是内存溢出。

确实是,但是java里内存分好几种,堆内存、栈内存、静态内存区等等,下面记录下我的排查问题步骤,以及解决方法。

一、查看服务器内存使用情况。

看看tomcat崩溃的时候,tomcat进程使用内存是否明显占用较多。

二、查看tomcat日志

catalina.201X-XX-XX.log

这个日志记录tomcat每次启动的情况。

localhost.201X-XX-XX.log

这个日志记录tomcat里各个webapp运行情况的日志。

项目在tomcat里运行一段时间总是自动崩掉的问题排查与解决_tomcat

localhost_access_log.201X-XX-XX.txt

这个日志记录每次url访问的情况。

项目在tomcat里运行一段时间总是自动崩掉的问题排查与解决_经验_02

看日志可以明白,是报java.lang.StackOverflowError错误了,这个是栈内存溢出,然后还可以看到是在testServlet里的75行出错了。

这一行是啥呢?

out.println(sss.toString());

sss是一个相对很大的方法内的局部变量,一两次访问这个url可能不会有啥大的感觉,最多稍微慢点,但是并发访问多一点,内存溢出就不可避免了。

三、解决方法

1.增大tomcat的栈内存。

具体看这个:Tomcat配置与优化(内存、并发、管理)与性能监控

2.改代码,避免太大的局部变量。

四、以后如何监控tomcat运行情况

使用jdk自带的JvisualVM工具,这个工具很好用,能监控各种java进程的情况,tomcat、eclipse等等,不光能监控本机的,而且还能监控远程的服务器。

项目在tomcat里运行一段时间总是自动崩掉的问题排查与解决_分享_03