Jdbc和Tomcat怀疑内存泄漏

时间:2015-02-02 04:08:02

标签: java tomcat jdbc memory-leaks

我在tomcat日志中收到了这些消息:

" org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc  Web应用程序注册了JBDC驱动程序[com.mysql.jdbc.Driver],但在Web应用程序停止时无法取消注册。为防止内存泄漏,JDBC驱动程序已被强制取消注册。"

" org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 严重:Web应用程序似乎已启动名为[pool-820-thread-1]的线程,但未能将其停止。这很可能会造成内存泄漏。"

实际上我的java项目中有一个JDBC驱动程序(.jar),我总是将它作为.war部署在tomcat服务器上(意味着驱动程序始终位于war / libs目录中)。

在我的搜索之后,我找到了一个很好的答案开始here但不幸的是我无法在stackoverflow上发表评论以获得有关已接受答案的更多详细信息。

以下是我的问题:   - 答案是否建议从war / libs目录中完全删除.jar?   - 如果是的话,我该把它放在哪里?因为我没有得到如何完全摆脱.jar,仍然能够在本地对数据库进行测试。

请就此提出建议。

1 个答案:

答案 0 :(得分:2)

自Tomcat 6.0以来,一直有一项功能可以检测类加载器内存泄漏。阅读更多here。 tomcat的上述消息纯粹是出于信息目的,tomcat已经采取了足够的措施来通过取消注册Driver来避免类加载器泄漏。

为了防止它正如您正确指出的那样,您可以将jar完全移动到tomcat的lib文件夹,在该文件夹中它不会受到应用程序上下文重新加载的影响。或者您可以明确地呼叫DriverManager.deregister(driver)。 (阅读here

要了解有关ClassLoader泄漏(here

的更多信息

要了解其建议将其从应用tomcat lib移至WEB_INF/lib的原因,您可以阅读更多here.

编辑以回复评论中的查询

不建议不要使用多个罐子,因为它会导致classcastexception。每个类都由类名和类加载器的组合标识。请查看this以获得更清晰的理解。

根据我的更好的方法是编写一个servlet上下文监听器,并在被破坏的上下文中显式取消注册你的驱动程序。这样您就可以在web-inf/lib中保留jdbc驱动程序,而无需将其移至tomcat/lib

即使你将jar放在多个位置,根据tomcat遵循的类加载器层次结构,这与java委托模型(更多信息here)不同,tomcat将在你的{{1}中选择jar首先。