1. 背景
项目部署在服务器上,在夜深人静的时候闪退了2次,第二天早上来了之后,发现tomcat服务器又被关闭了,因为服务器之前总有人恶搞(行为类似:数据库的配置信息max_packet被修改,在tomcat下跑了别人的项目),就一直认为是有人在恶搞,试着保护自己的服务器,用电脑管家杀了毒。以为没事了,但是在下一天的早上同样的事情又发生了,由于甲方的压力,自己硬着头皮去找出线索。
2. 行动
-
看了tomcat的日志文件
开始设想,是不是因为“sessionCreated” ,在网上搜索了sessionCreated,有人说是正常信息的打印,没有往下继续探索为什么会打印这种信息。
-
继续
是不是因为这个呢,通过搜索发现也不是,网上说tomcat-user.xml把注释删掉就不会有这些东西了,我仍然没有验证。
- 同样在,access_log中发现这样的错误信息
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986”
感觉就是地址中带上了非法的字符,不应该直接把tomcat搞崩溃啊,tomcat的日志文件都看了,依然什么线索没有发现,快要走不下去......
- 直接百度吧
直接在百度上搜索了“tcomat异常退出情况”
看到了一个大牛的blog tomcat异常退出情况 果然就是不一样,给我提供了几种设想,会不会是应为内存溢出什么的呢,然后在tomcat的bin目录下发发现了几个好奇的文件
A fatal error has been detected by the Java Runtime Environment:
然后发现又好多大牛的关于此类问题的blog,我着重看的是这个大牛的 A fatal error has been detected by the Java Runtime Environment: 果然是站在巨人的肩膀上,分析的特别具体,但是由于自己太菜,有好多关于jvm的知识没有接触,反正最终的出的结论就是内存不够用
Stack: [0x0000000032d70000,0x0000000032e70000], sp=0x0000000032e6ee50, free space=1019k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [tcnative-1.dll+0x14ac2]
C [tcnative-1.dll+0x11e7]
C 0x0000000004b04d0a
发现free space 仅有1M,感觉显示内存溢出的原因,既然有了这个原因,就下手吧
故事还未完,项目需要一段时间的测试,来验证问题是否已经解决。
经过1个星期的测试,项目没有闪退过,应该就是这个问题了。
3. 总结
- 平时要加强对底层知识的学习力度
- 要善于查看日志,能够根据日志分析项目的运行状态
- 保持一颗好奇心,对未知的事物不要服从