tomcat内存溢出问题解决经历

 更新时间:2019年09月17日 09:21:31   作者:冰湖一角  
这篇文章主要介绍了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一个对象,多可怕的代码,在心里一直骂自己当时怎么想的!这次经历我会引以为戒,记下来也是告诉自己以后不要再犯类似的问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 实现将Web应用部署到Tomcat根目录的三种方法

    实现将Web应用部署到Tomcat根目录的三种方法

    本篇文章主要介绍了实现将Web应用部署到Tomcat根目录的三种方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • tomcat虚拟路径的配置方法汇总

    tomcat虚拟路径的配置方法汇总

    本文给大家简单汇总介绍了tomcat虚拟路径的配置方法,十分的简单实用,有需要的小伙伴可以参考下。
    2016-01-01
  • 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

    启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port

    这篇文章主要介绍了启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法的相关资料,需要的朋友可以参考下
    2016-05-05
  • Win10配置tomcat环境变量教程图解

    Win10配置tomcat环境变量教程图解

    这篇文章主要介绍了Win10配置tomcat环境变量教程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • window7下Tomcat7.0安装配置方法

    window7下Tomcat7.0安装配置方法

    这篇文章主要介绍了window7下Tomcat7.0安装配置方法,需要的朋友可以参考下
    2014-07-07
  • Tomcat核心组件及应用架构详解

    Tomcat核心组件及应用架构详解

    众所周知Tomcat 就是一个 Servlet 容器,为了方便使用,他们具有http服务器的功能,所以Tomcat 就是一个“HTTP 服务器 + Servlet 容器”,我们也叫它们 Web 容器,今天重点给大家普及Tomcat核心组件及应用架构相关知识,感兴趣的朋友一起了解下吧
    2021-05-05
  • 详解Tomcat中Filter的执行流程

    详解Tomcat中Filter的执行流程

    Filter是servlet规范中定义的java web组件, 在所有支持java web的容器中都可以使用,它是位于前端请求到servlet之间的一系列过滤器,也可以称之为中间件,本文详解介绍了Tomcat中Filter是怎样执行的,需要的朋友可以参考下
    2023-06-06
  • Linux系统centos7.X安装tomcat8的图文教程

    Linux系统centos7.X安装tomcat8的图文教程

    这篇文章主要介绍了Linux系统centos7.X安装tomcat8的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 如何提升Idea启动速度与Tomcat日志乱码问题

    如何提升Idea启动速度与Tomcat日志乱码问题

    这篇文章主要介绍了提升Idea启动速度与Tomcat日志乱码问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 一文教你怎么选择Tomcat对应的JDK版本

    一文教你怎么选择Tomcat对应的JDK版本

    这篇文章主要给大家截介绍了怎么选择Tomcat对应的JDK版本,如果不知道Tomcat的哪个版本应该对应哪个版本的JDK,可以参考借鉴本文,对大家的学习有一定的帮助
    2023-10-10

最新评论