当我关闭Tomcat时,我收到错误消息,表明有一个线程和几个线程本地未正确清理。
我的Web应用程序当前使用嵌入式H2数据库进行设置,并部署在Tomcat Web应用程序服务器上。它大约一周前成功部署在生产中。
系统信息:
OS: Ubuntu 14.04 (dev), Ubuntu 12.04 (test), Solaris 5.11 (prod)
Tomcat: 7.0.53
Java: 1.7.0_55
Grails: 2.3.8
DataSource.groovy
目前看起来像这样:
dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = 'myDbUserName'
password = 'myDbPassword'
dbCreate = 'update'
url = "jdbc:h2:/h2db/myApp_test;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
请注意,尽管有这些消息,Tomcat仍会正常停止,没有任何明显的延迟。所以没有必要杀死这个过程(直到现在我都不得不这样做,但这是因为我自己的代码清理不当 - 现在已经解决了)。
但是,我不喜欢有这样的错误消息。这让我担心,因为我不确定后果,例如执行hotdeploy时,或者应用程序已运行很长时间而不重新启动。是否会导致内存泄漏一段时间后累积到OutOfMemoryError?我会得到数据库锁定问题吗?其他问题?
以下是相关的错误消息(编号为便于参考):
重度: Web应用程序[/ my-app]似乎已启动一个名为的线程 [H2 File Lock Watchdog /home/steinar/h2db/myApp_test.lock.db]但未能阻止它。 这很可能会造成内存泄漏。
重度: Web应用程序[/ my-app]创建了一个类型为key的ThreadLocal [java.lang.ThreadLocal](value [java.lang.ThreadLocal@15dd7182])和类型的值 [org.apache.cxf.BusFactory.BusHolder](value [org.apache.cxf.BusFactory$BusHolder@7d471904]) 但是在Web应用程序停止时无法将其删除。 线程将随着时间的推移而更新,以避免可能的内存泄漏。
重度: Web应用程序[/ my-app]创建了一个类型为key的ThreadLocal [org.codehaus.groovy.grails.orm.hibernate.support.HibernatePersistenceContextInterceptor $ 1] (value [org.codehaus.groovy.grails.orm.hibernate.support.HibernatePersistenceContextInterceptor$1@46bb95dd]) 和[java.util.HashMap]类型的值(值[{}]) 但是在Web应用程序停止时无法将其删除。 线程将随着时间的推移而更新,以避免可能的内存泄漏。
- 醇>
重度: Web应用程序[/ my-app]创建了一个类型为key的ThreadLocal [org.codehaus.groovy.grails.orm.hibernate.support.HibernatePersistenceContextInterceptor $ 2] (value [org.codehaus.groovy.grails.orm.hibernate.support.HibernatePersistenceContextInterceptor$2@456c0472]) 和[java.util.HashMap]类型的值(值[{DEFAULT = 0}]) 但是在Web应用程序停止时无法将其删除。 线程将随着时间的推移而更新,以避免可能的内存泄漏。
我对这些的评论/问题:
H2文件锁看门狗线程。看起来Web应用程序无法在关机时正确关闭H2。我尝试在JDBC URL中尝试使用
DB_CLOSE_ON_EXIT
,但所有选项(TRUE
,FALSE
或省略它)都会为我产生相同的消息和行为。我也试过看Grails文档来自CXF
ThreadLocal
的“可能内存泄漏”?我该如何避免?我在没有此问题的其他(非grails)Web应用程序中使用CXF。是因为Grails有什么作用吗?- 醇>
和4.“可能的内存泄漏”来自
ThreadLocal
s,看起来像Grails的Hibernate插件。谁知道我怎么能摆脱这些?
非常感谢您对这些错误消息或(甚至更好)解决方案的见解。