@Scheduled注解内存泄漏问题

问题遇到的现象和发生背景

sprintBoot框架,需要做一个定时器,每过100秒就查询一次数据库,然后进行一系列逻辑
我用了@Scheduled注解,测试环境一切正常,可是一部署到阿里云tomcat里,启动就报内存泄漏。

问题相关代码,请勿粘贴截图
     /**
     * 数据转化到运行表 100秒一次
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    @Scheduled(fixedRate = 1000 * 100)
    public void toRun() {
        System.out.println("原始数据转化开始·····"+DateUtil.now());
        List<MachineRawDataDto> list = machineRawDataMapping.toDto(baseMapper.findByNoIsDeal());
        synchronized (this){
            for (MachineRawDataDto dto : list) {
                TenantRequestContext.setTenantLocal(dto.getTenantId());
                MachineDto machineDto = machineService.findOneByFields("code",dto.getMachineCode());
                MachineRunDto runDto = machineRunService.findOneByFields("machine_id",machineDto.getId(),"is_deal","0");
                //没有找到数据或者该数据已经有结束时间,则新建一条数据
                if(runDto==null || runDto.getEndTime()!=null){
                    runDto = new MachineRunDto();
                    runDto.setBeginTime(dto.getReceiveTime());
                    runDto.setMachineId(machineDto.getId());
                }
                if(RawKeyEnum.产量.equals(dto.getKey())){
                    if(Arith.compare(runDto.getProductNumber(),dto.getValue())==0){
                        runDto.setDownCount((int)Arith.addMore(runDto.getDownCount(), 1));//产量不变,则计数器加1
                    }else{
                        runDto.setDownCount(0);//产量变化,则计数器归零
                    }
                    runDto.setProductNumber(dto.getValue());
                }else if(RawKeyEnum.速度.equals(dto.getKey())){
                    runDto.setProductSpeed(dto.getValue());
                }
                machineRunService.create(runDto);
                dto.setIsDeal(true);
                baseMapper.updateById(machineRawDataMapping.toEntity(dto));
            }
        }
        System.out.println("·····原始数据转化结束");
    }


运行结果及报错内容
20-Jun-2022 18:41:29.380 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-1]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]


我的解答思路和尝试过的方法
我想要达到的结果

报错截全一点吧,感觉引发这个报错的是其他底层报错,比如:数据库连接失败导致定时任务执行报错,线程被异常中止。
日志发成评论也是可以的。报错是类找不到com.device.util.SpringContextHolder
如果你咬定不是这个报错的问题,那只能说你挺自信。

你这是多少数据呀,一次全部查出来处理?还放一个事务里


20-Jun-2022 18:41:29.379 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[mysql-cj-abandoned-connection-cleanup]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 java.lang.ref.ReferenceQueue.remove(Unknown Source)
 com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:85)
 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 java.lang.Thread.run(Unknown Source)]
20-Jun-2022 18:41:29.380 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[OkHttp ConnectionPool]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 java.lang.Object.wait(Unknown Source)
 okhttp3.ConnectionPool.lambda$new$0(ConnectionPool.java:66)
 okhttp3.ConnectionPool$$Lambda$417/1240092510.run(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 java.lang.Thread.run(Unknown Source)]
20-Jun-2022 18:41:29.380 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[Okio Watchdog]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 java.lang.Object.wait(Unknown Source)
 okio.AsyncTimeout.awaitTimeout(AsyncTimeout.java:362)
 okio.AsyncTimeout$Watchdog.run(AsyncTimeout.java:313)]
20-Jun-2022 18:41:29.380 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-1]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]
20-Jun-2022 18:41:29.382 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-2]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]
20-Jun-2022 18:41:29.383 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-3]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]
20-Jun-2022 18:41:29.384 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-4]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]
20-Jun-2022 18:41:29.384 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-5]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]
20-Jun-2022 18:41:29.384 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-6]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]
20-Jun-2022 18:41:29.384 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-7]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]
20-Jun-2022 18:41:29.384 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-8]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]
20-Jun-2022 18:41:29.384 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-9]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]
20-Jun-2022 18:41:29.385 警告 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[device]似乎启动了一个名为[quartzScheduler_Worker-10]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)]
20-Jun-2022 18:41:29.395 信息 [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR 正在部署web应用程序存档文件[C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\device.war]
20-Jun-2022 18:41:29.432 信息 [mysql-cj-abandoned-connection-cleanup] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading 非法访问:此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。
    java.lang.IllegalStateException: 非法访问:此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1392)
        at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1045)
        at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader(AbandonedConnectionCleanupThread.java:117)
        at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:84)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
20-Jun-2022 18:41:32.656 警告 [localhost-startStop-2] org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [4.0]。将使用默认版本。
20-Jun-2022 18:41:38.117 信息 [localhost-startStop-2] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。
20-Jun-2022 18:41:40.098 严重 [localhost-startStop-2] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 
    org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/device]]
        at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:691)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1015)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1895)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
    Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.device.DevApplication]; nested exception is java.lang.IllegalStateException: Failed to introspect annotated methods on class com.device.DevApplication
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:181)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:315)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95)
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:705)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:157)
        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:137)
        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:91)
        at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5157)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        ... 10 more
    Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class com.device.DevApplication
        at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:169)
        at org.springframework.context.annotation.ConfigurationClassParser.retrieveBeanMethodMetadata(ConfigurationClassParser.java:392)
        at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:317)
        at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242)
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:199)
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
        ... 26 more
    Caused by: java.lang.NoClassDefFoundError: com/device/util/SpringContextHolder
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getDeclaredMethods(Unknown Source)
        at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:158)
        ... 31 more
    Caused by: java.lang.ClassNotFoundException: com.device.util.SpringContextHolder
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1372)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1195)
        ... 35 more
20-Jun-2022 18:41:40.102 严重 [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR 部署 Web 应用程序 archive [C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\device.war] 时出错
    java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/device]]
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:747)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:691)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1015)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1895)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
20-Jun-2022 18:41:40.102 信息 [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR web应用程序存档文件[C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\device.war]的部署已在[10,707]ms内完成
20-Jun-2022 18:41:40.103 信息 [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\dev_device]
20-Jun-2022 18:41:40.194 警告 [localhost-startStop-2] org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [4.0]。将使用默认版本。
20-Jun-2022 18:41:41.969 信息 [Thread-9] org.apache.coyote.AbstractProtocol.pause 暂停ProtocolHandler["http-nio-8080"]
20-Jun-2022 18:41:42.022 信息 [Thread-9] org.apache.catalina.core.StandardService.stopInternal 正在停止服务[Catalina]
20-Jun-2022 18:41:42.025 严重 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployDirectories 等待目录的多线程部署完成时出错
    java.lang.InterruptedException
        at java.util.concurrent.FutureTask.awaitDone(Unknown Source)
        at java.util.concurrent.FutureTask.get(Unknown Source)
        at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1098)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:475)
        at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1652)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
        at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1159)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1385)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1353)
        at java.lang.Thread.run(Unknown Source)
20-Jun-2022 18:41:43.805 信息 [localhost-startStop-2] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
20-Jun-2022 18:41:56.417 信息 [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\dev_device]的部署已在[16,313]毫秒内完成
20-Jun-2022 18:41:56.573 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [ipm-system-4.0] 注册了JDBC驱动程序 [net.sf.log4jdbc.sql.jdbcapi.DriverSpy],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
20-Jun-2022 18:41:56.573 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [ipm-system-4.0] 注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
20-Jun-2022 18:41:56.575 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[ipm-system-4.0]似乎启动了一个名为[logback-2]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[


java.lang.ClassNotFoundException: com.device.util.SpringContextHolde
这是啥玩意,这是你自己的代码?别又是那种本地jar吧

jdbc驱动包换成

com.mysql.cj.jdbc.Driver