jfinal集成quartz插件导致tomcat内存泄漏

环境是在Linux部署项目,启动tomcat运行的时候没有问题,但是关闭tomcat的时候看到日志里面有内存泄漏的警告,因为我的是定时修改,有一个JDBC的错误大概就是关闭tomcat的时候这个操作没有回滚回来。而内存泄漏的问题大概就是tomcat关闭之前没有先关闭quartz的线程导致内存泄漏,这个情况该怎么解决???

23-Oct-2019 14:37:31.067 INFO [main] org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Server instance.
23-Oct-2019 14:37:31.068 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8765"]
23-Oct-2019 14:37:31.120 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-9009"]
23-Oct-2019 14:37:31.171 INFO [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
23-Oct-2019 14:37:31.554 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] registered the JDBC driver [com.alibaba.druid.proxy.DruidDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
23-Oct-2019 14:37:31.555 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] registered the JDBC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
23-Oct-2019 14:37:31.557 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [OracleTimeoutPollingThread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Thread.sleep(Native Method)
 oracle.jdbc.driver.OracleTimeoutPollingThread.run(OracleTimeoutPollingThread.java:150)
23-Oct-2019 14:37:31.559 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [DefaultQuartzScheduler_Worker-7] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:543)
23-Oct-2019 14:37:31.560 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [DefaultQuartzScheduler_Worker-9] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:543)
23-Oct-2019 14:37:31.562 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [DefaultQuartzScheduler_Worker-10] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:543)


评论区

JFinal

2019-10-23 17:25

tomcat 在 shutdown 的时候没有关掉 druid 与 quartz,可能是它们有 "非 deamon" 线程正在运行

信息提示 tomcat 已经强制关闭了它们,需要确定一下 tomcat 是否真的 shutdown 成功,如果成功不会造成资源泄漏,因为 JVM 退出时会回收所有资源

此外,信息中提示是 WARNING, 措辞是 "likely",也就是 tomcat 并不是完全确定

建议使用 jfinal undertow,不存在这里问题:
https://www.jfinal.com/doc/1-2

jfinal undertow 支持开发、打包、部署一体化,性能更高,不必再折腾 tomcat 下载、安装、配置这种事情

dplxm

2019-10-23 17:54

@JFinal 波总,jfinal undertow确实部署起来比较简单,但是jfinal.sh这个脚本里面用的是JDK,我部署的这个服务器有很多项目都在里面运行,不允许我配置环境变量(里面很多项目需要的JDK版本都不同),也就是说我没有JDK环境,脚本自认而然运行不起来(可以运行起来,但是得修改脚本,头痛)。所以我只能用tomcat内置指定JDK的路径来达到发布效果。回到问题上来,tomcat确实是关闭成功了,然后内存没有内存泄漏的想象,查看所有的Java进程也是0,一切看起来都安好,就是怕久了确实是内存泄漏导致服务器宕机。我再找找原因,如果没办法就只能使用jfinal undertow然后修改脚本,谢谢波总,波总牛皮

JFinal

2019-10-23 17:59

@dplxm 你既然都能使用 tomcat 内置指定 JDK 路径来发布,为啥不在 jfinal.sh 中指定 JDK 路径呢?

修改起来简单到不能再简单,jfinal.sh 中有一个类似下面的 JDK 启动命令行:
java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} &

将其中的 java 前方添加上 JDK 的路径即可,例如:
/opt/jdk-1.8/bin/java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} &

dplxm

2019-10-23 18:31

@JFinal 哈哈哈,我刚开始也以为是这么简单 ,但是我看到了${JAVA_OPTS}这个东西,而且上面没有指定这个变量,以为是环境变量,ok,谢谢波总,我要去试一试

chcode

2019-10-23 19:38

@dplxm ${JAVA_OPTS} 没有定义会自动忽略,不用担心

dplxm

2019-10-24 18:19

@chcode 好的好的,问题已经解决了,我用的是fatjar的方式发布的,完全没有问题,关闭日志可以说明一切
Shutdown Undertow Server ......
[INFO ] 2019-10-24 17:48:24,984 method:org.quartz.core.QuartzScheduler.shutdown(QuartzScheduler.java:639)
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
[INFO ] 2019-10-24 17:48:24,984 method:org.quartz.core.QuartzScheduler.standby(QuartzScheduler.java:560)
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
[INFO ] 2019-10-24 17:48:24,985 method:org.quartz.core.QuartzScheduler.shutdown(QuartzScheduler.java:711)
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
[DEBUG] 2019-10-24 17:48:25,084 method:org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:595)
WorkerThread is shut down.
[DEBUG] 2019-10-24 17:48:25,112 method:io.undertow.Undertow.stop(Undertow.java:254)
stopping undertow server io.undertow.Undertow@5f6ae1d
Shutdown Complete in 0.1 seconds. See you later (^_^)

JFinal

2019-10-24 18:24

@dplxm 使用 jfinal undertow 爽多了

dplxm

2019-10-24 18:26

@JFinal 波总,非常感谢,我是用到你所说的fatjar的方式发布的,完全没有问题,就是使用fatjar方式发布的话pom文件的插件需要改进一下,不然会报java.lang.SecurityException: Invalid signature file digest for Manifest main attributes错误。

org.apache.maven.plugins
maven-shade-plugin
3.2.1


package

shade


stuck_pip_api


*:*

META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA





com.atuinfo.common.DemoConfig














JFinal

2019-10-24 18:28

@dplxm fatjar 发布改进 pom.xml 希望你能发个分享贴出来,回复无法贴 xml

dplxm

2019-10-24 18:28

@JFinal 这个插件具体内容发不出emmm,直接发解决方法的博客吧。https://www.cnblogs.com/buptl/archive/2017/04/27/6774016.html

热门反馈

扫码入社