Java程序导致服务死机的情况
Java程序导致服务死机的情况
今天公司质控部对所有项目的监控,发现以下几个问题导致Tomact崩溃,对以下几个问题,总结一下,记录下来。
在Java程序中容易引起Tomact服务器挂掉的最严重的几个问题如下:
1、内存溢出
2、连接不释放
3、数据库SQL执行缓慢
4、大数据量查询
5、excel数据导入导出
6、日志记录问题
7、触发器问题
我下面会一个一个的讲解。(这些问题中是交叉出现的)
第一个:内存溢出问题。
关于内存溢出问题,我们先看看JVM内存模型以及垃圾回收机制。
Java内存溢出的两种可能的地方
在一些项目中出现内存溢出的情况如下:
1、Session会话保持时间太久,缓存在会话中的对象没有释放,导致内存被过度耗用。最终出现溢出。【建议在系统中的会话失效时间可以设置为4小时,具体根据项目而制定】
2、程序设计不合理,关闭窗口的时候没有清除相关的Session信息。【建议关闭窗口的时候,清除Session】
3、查询数据量过大。不需要一张表的数据一次查询出来,建议使用分页查询。具体看业务而定。
4、使用导出、导入Excel时出现内存溢出,jxl相关的对象占用大量的内容。建议在excel导出和导入的操作中,不要一次性将一张表的数据都导出\导入。
5、数据库链接不释放问题。可以使用detect来监控。出现这种问题主要是在Spring中事物配置在Service中,有些代码直接调用DAO,绕过了Service,那么事物将不能被关闭。
6、比如一些需要关闭的操作没有关闭,像Session,IO操作等。如下:
7、SQL执行缓慢问题。一条SQL语句执行了很长很长时间都没有返回结果,轻者影响本模块的使用,严重的导致整个数据库被拖死,所有其他功能模块均受影响,因此,SQL的执行效率对系统性能有很大影响。
MS SQL Server中获取执行最慢的SQL语句。
Oracle 中获取执行最慢的SQL语句。
8、日志记录问题。
主要是在集群的环境下,比如8个Tomact集群,每个Tomact中的应用中的log4j都使用绝对路径(相当于8个Tomact共享一个日志文件),日志的写入都是单线程的,但前段压力来的时候,导致大量线程在日志处理的部分卡住。
9、触发器问题。
(1)、当项目管理与合同管理2个库之间的网路不可靠 或者合同管理的库有异常,停止服务由于触发器的缘故,项目管理的相关模块将被阻塞,无法正常运行。
(2)、触发器的逻辑没有处理好。出现了死循环。拖死了数据库。
优化的原则: