Spring Boot的项目在直接关闭Tomcat8后,Tomcat8报内存溢出的4个警告(目前解决两个)

直接停止Tomcat8后提示的警告异常如下图所示,共有四个警告	:

在这里插入图片描述

  •  从图中可以看出,共有四个警告异常:
     第一个:数据库链接未释放,被强制反注册
     第二个~第四个:应用关闭,但是线程未释放,导致报出了可能会有内存溢出的警告
    

解决方法:
第一个:参考了网上诸多大神的博客,添加如下监听器,可解决第一个数据库链接未释放问题,此解决方法在我的项目中可以起到作用;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;

@Configuration
public class UnregisterDataSourceListener implements ServletContextListener {

    Logger logger = LoggerFactory.getLogger(UnregisterDataSourceListener.class);

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // On Application Startup, please…

        // Usually I'll make a singleton in here, set up my pool, etc.
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
      // This manually deregisters JDBC driver, which prevents Tomcat 7 from complaining about memory leaks wrto this class
        Enumeration<Driver> drivers = DriverManager.getDrivers();
        while (drivers.hasMoreElements()) {
            Driver driver = drivers.nextElement();
            try {
                DriverManager.deregisterDriver(driver);
                logger.debug("deregistering jdbc driver:{}", driver);
            } catch (SQLException e) {
                e.printStackTrace();
                logger.debug("Error deregistering driver:{}", driver);
                logger.debug("Error message:{}", e.getMessage());
            }

        }
    }

}

第二个~第四个:
主要是由于我的项目中在启动时需要加载企业微信的配置,获取Token,故启动了一个线程获取,最后线程未被回收,修改了一个监听器,改为实现ServletContextListener后又减少了一个警告:

import com.supplychain.controller.wechat.TokenThread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * token失效管理
 * @author Hangele
 * @since 2018-09-17
 */
@Configuration
public class InitAppIdAndSecret implements ServletContextListener {

    private static Logger logger = LoggerFactory.getLogger(InitAppIdAndSecret.class);

    public void contextInitialized(ServletContextEvent e) {
        logger.info("contextInitialized starting");
        // 启动定时获取access_token的线程,暂时先拿掉,调试微信时再开放。
        String os = System.getProperty("os.name");
        logger.info(" 当前操作系统环境为:{}", os);
        if (os.toLowerCase().startsWith("win")) {
            logger.info("windows环境,access_token的线程不启动");
        } else {
            logger.info("启动定时获取access_token的线程............");
            new Thread(new TokenThread()).start();
        }
        logger.info("contextInitialized ends");
    }

    public void contextDestroyed(ServletContextEvent e) {
        logger.info("contextDestroyed starting");
        System.gc();
        logger.info("contextDestroyed ends");
    }
}

在释放上下文时,调用了GC但是好像并没有起到作用,还是要另寻办法,先记录至此!

修改后,效果如下图所示:
在这里插入图片描述

暂时去掉了两个,线程未释放目前还未解决,不知道GC啥时候会回收…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值