Java程序导致服务死机的情况

今天公司质控部对所有项目的监控,发现以下几个问题导致Tomact崩溃,对以下几个问题,总结一下,记录下来。

在Java程序中容易引起Tomact服务器挂掉的最严重的几个问题如下:

                1、内存溢出

                2、连接不释放

                3、数据库SQL执行缓慢

                4、大数据量查询

                5、excel数据导入导出

                6、日志记录问题

                7、触发器问题

我下面会一个一个的讲解。(这些问题中是交叉出现的)

第一个:内存溢出问题。

关于内存溢出问题,我们先看看JVM内存模型以及垃圾回收机制。

Java程序导致服务死机的情况_第1张图片

Java内存溢出的两种可能的地方

Java程序导致服务死机的情况_第2张图片

在一些项目中出现内存溢出的情况如下:

1、Session会话保持时间太久,缓存在会话中的对象没有释放,导致内存被过度耗用。最终出现溢出。【建议在系统中的会话失效时间可以设置为4小时,具体根据项目而制定】

2、程序设计不合理,关闭窗口的时候没有清除相关的Session信息。【建议关闭窗口的时候,清除Session】

        3、查询数据量过大。不需要一张表的数据一次查询出来,建议使用分页查询。具体看业务而定。

        4、使用导出、导入Excel时出现内存溢出,jxl相关的对象占用大量的内容。建议在excel导出和导入的操作中,不要一次性将一张表的数据都导出\导入。

        5、数据库链接不释放问题。可以使用detect来监控。出现这种问题主要是在Spring中事物配置在Service中,有些代码直接调用DAO,绕过了Service,那么事物将不能被关闭。

        6、比如一些需要关闭的操作没有关闭,像Session,IO操作等。如下:

       Java程序导致服务死机的情况_第3张图片

    7、SQL执行缓慢问题。一条SQL语句执行了很长很长时间都没有返回结果,轻者影响本模块的使用,严重的导致整个数据库被拖死,所有其他功能模块均受影响,因此,SQL的执行效率对系统性能有很大影响。

MS SQL Server中获取执行最慢的SQL语句。

        Java程序导致服务死机的情况_第4张图片

         Oracle 中获取执行最慢的SQL语句。

        Java程序导致服务死机的情况_第5张图片

       8、日志记录问题。

主要是在集群的环境下,比如8个Tomact集群,每个Tomact中的应用中的log4j都使用绝对路径(相当于8个Tomact共享一个日志文件),日志的写入都是单线程的,但前段压力来的时候,导致大量线程在日志处理的部分卡住。

      9、触发器问题。

(1)、当项目管理与合同管理2个库之间的网路不可靠 或者合同管理的库有异常,停止服务由于触发器的缘故,项目管理的相关模块将被阻塞,无法正常运行。

        (2)、触发器的逻辑没有处理好。出现了死循环。拖死了数据库。


优化的原则:

Java程序导致服务死机的情况_第6张图片


你可能感兴趣的:(Java)