w20228396 2018-08-24 13:33 采纳率: 0%
浏览 2792
已结题

定时任务quartz开启线程,在tomcat关闭时候,报内存泄露,如何解决?

报错内容如下
[INFO][2018-08-24 21:30:11] com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:1825) {dataSource-1} closed
24-Aug-2018 21:30:11.702 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [pool-2-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:745)
24-Aug-2018 21:30:11.702 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [pool-3-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:745)
24-Aug-2018 21:30:11.703 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [pool-4-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:745)
24-Aug-2018 21:30:11.705 信息 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-apr-8080"]
24-Aug-2018 21:30:11.773 信息 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-apr-8009"]
24-Aug-2018 21:30:11.825 信息 [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-apr-8080"]
24-Aug-2018 21:30:11.826 信息 [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-apr-8009"]


根据网上的解决方法,我已经关闭了定时任务Scheduler,关闭了开启定时任务的线程池,也关闭了数据源。为什么还是报错?
我的代码
package com.yz.robot.spring;

import com.yz.robot.mcore.utils.SpringContextUtils;
import com.yz.robot.mquartz.service.ScheduleJobService;
import com.yz.robot.mquartz.service.impl.ScheduleJobServiceImpl;
import com.yz.robot.mquartz.utils.ScheduleJob;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Enumeration;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;

public class QuartzJobListener implements ServletContextListener
{
@Autowired
private ScheduleJob scheduleJob;

@Override
public void contextInitialized(ServletContextEvent sce) {
    System.out.println("--------------开始-------");
}

@Override
public void contextDestroyed(ServletContextEvent sce){
    WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
    if (webApplicationContext != null){
        Object scheduleJobServiceImpl = webApplicationContext.getBean("scheduleJob");
        System.out.println("-------------------------2");
        System.out.println(scheduleJobServiceImpl !=null);
    }else {
        System.out.println("获取应用程序上下文失败!");
    }
    try {
        Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();
        System.out.println("-------------------------2");
        System.out.println(defaultScheduler.isShutdown());
        defaultScheduler.shutdown(true);
        Thread.sleep(1000);
        System.out.println(defaultScheduler.isShutdown());


        ScheduleJob  scheduleJob = (ScheduleJob) SpringContextUtils.getBean("scheduleJob");
        //scheduleJobServiceImpl
        ExecutorService service = scheduleJob.getService();
        System.out.println("-------------------------3");
        System.out.println(service!=null);
        System.out.println(service.isShutdown());
        List<Runnable> runnables = service.shutdownNow();
        System.out.println(service.isShutdown());
        Thread.sleep(1000);
        System.out.println("-------------------------4");


        Enumeration<Driver> drivers = DriverManager.getDrivers();
        while (drivers.hasMoreElements()){
            Driver driver = drivers.nextElement();
            DriverManager.deregisterDriver(driver);
            System.out.println("又注销了一个driver"+driver.toString());
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

大佬们帮帮我吧???





  • 写回答

2条回答 默认 最新

  • Angel_1987 2018-08-26 14:48
    关注

    我粗略看了一下你的代码,你这种情况我觉得可能是因为你在关闭线程时你的程序还需要占着内存处理业务逻辑。但因为线程被你强制关闭了。资源突然没了导致出现内存溢出的问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3