zoukankan      html  css  js  c++  java
  • 记一次tomcat内存大涨到溢出的经历

    前一段时间提交了一个产品版本给测试人员测试,测试结果简直出人意料!

    测试一段时间后页面就卡死了,当时根据这个现象下意识的怀疑是卡到数据库这一层,然后查看数据库连接相关的参数,如意料之中的相似,连接数太多了!当把数据库连接数解决后,本以为这个bug解决了,但是...

    测试一段时间后页面又卡死了!!!

    打开任务管理器,发现tomcat内存超过了1.5G,而且tomcat关不掉!是什么原因导致的呢?左思右想之后,想到了一个可能会导致tomcat内存上涨的点,那就是多线程,然后翻代码找线程池的配置,发现也没什么可疑之处。

    那就先解决下tomcat关不掉的问题吧,百度...检查代码...几十分钟后找到了,在tomcat监听器的销毁方法(contextDestroyed)里没有关闭线程池,这种情况下,由于线程池没法关闭,进而导致tomcat无法关闭的问题。

    将代码改为:

    public class InitListener implements ServletContextListener{
        private Logger logger = Logger.getLogger(InitListener.class);
        
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            logger.info("启动tomcat");
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            logger.info("关闭tomcat,关闭线程池");
            ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
            ThreadPoolTaskExecutor myTaskExecutor = (ThreadPoolTaskExecutor) classPathXmlApplicationContext.getBean("myTaskExecutor");
            myTaskExecutor.shutdown();
        }
    
    }

    好了,tomcat关不掉的问题是解决了。

    接下来解决内存溢出的问题(先看日志):

    查看tomcat的日志发现,页面每一次调用后台接口Spring的配置文件都会初始化一遍,也就是每次请求spring都会重新注入一次bean,而且占用的内存不会被回收!

    然后我就想什么情况下会初始化spring的配置文件:tomcat启动的时候;通过关键字new出来的时候,即

     ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");

    然后就全局搜索代码找,果然在过滤器里找到了,每次接口来就会new一个对象,多可怕的代码,在心里一直骂自己当时怎么想的!这次经历我会引以为戒,记下来也是告诉自己以后不要再犯类似的问题。

    欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!

       ▼微信扫一扫下图↓↓↓二维码关注

     

  • 相关阅读:
    Mybatis分页插件PageHelper简单使用
    UUID
    JavaWeb初学者session的使用
    轻松理解AOP思想(面向切面编程)
    DOM操作中,getElementByXXXX 和 querySelector 的区别
    DOM操作中,遍历动态集合的注意事项。ex: elem.children
    微信官方团队放出了UI库,看来以后前端还要学WeChatUI了,哈哈
    jQuery中使用$.each()遍历后台响应的json字符串问题
    平衡树
    后缀数组原理浅析(转载自tqx)
  • 原文地址:https://www.cnblogs.com/bingyimeiling/p/11505844.html
Copyright © 2011-2022 走看看