当前位置: 首页 > 知识库问答 >
问题:

Jdbc和Tomcat疑似内存泄漏

桓风史
2023-03-14

我的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),我总是将其作为一个组件部署在tomcat服务器上。war(意味着驱动程序总是在war/libs目录中)。

在我的搜索之后,我在这里找到了一个很好的答案开始,但不幸的是,我还不能对stackoverflow发表评论,以获得关于已接受答案的更多细节。

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

请给出建议。

共有1个答案

端木涵润
2023-03-14

自Tomcat 6.0以来,就有了检测类加载器内存泄漏的功能。在这里阅读更多。tomcat的上述消息纯粹是为了提供信息,tomcat已经采取了足够的措施来通过取消注册驱动程序来避免类加载器泄漏。

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

了解更多关于类加载器泄漏的信息(此处)

要理解为什么建议将其从应用程序WEB\u INF/lib移动到tomcat lib,您可以在这里阅读更多内容。

编辑以响应注释中的查询

不,不建议有多个JAR,因为它可能导致classcastexception。每个类都由类名和类加载器的组合来标识。通过一个例子来了解这一点。

根据我的看法,更好的方法是编写一个servlet上下文侦听器,并在上下文销毁时显式取消注册驱动程序。这样,您就可以将jdbc驱动程序保存在web inf/lib中,而无需将其移动到tomcat/lib

即使您将jar保存在多个位置,根据tomcat遵循的类加载器层次结构,它不同于java委托模型(此处有更多信息),tomcat将首先在web inf/lib中提取jar。

 类似资料:
  • 问题内容: 由于Tomcat中的孤立线程,我遇到了内存泄漏。特别是,Guice和JDBC驱动程序似乎没有关闭线程。 我知道这与其他问题,但是就我而言,“不必担心”的答案是不够的,因为它给我带来了麻烦。我的CI服务器会定期更新此应用程序,重新加载6-10次后,由于Tomcat内存不足,CI服务器将挂起。 我需要能够清理这些孤立的线程,以便可以更可靠地运行CI服务器。任何帮助,将不胜感激! 问题答案:

  • 问题内容: 好的,所以我的程序有很多(〜300)线程,每个线程都与中央数据库通信。我创建了一个与数据库的全局连接,然后每个线程进行其业务创建语句并执行它们。 一路上的某个地方,我发生了大量内存泄漏。在分析堆转储之后,我看到com.mysql.jdbc.JDBC4Connection对象为70 MB,因为它在“ openStatements”(哈希映射)中有800,000个项目。在某个地方,它不能正

  • 我正在调试一个我在Tomcat应用程序中多年来遇到的问题——由于Webapp类加载器无法通过气相色谱重新启动应用程序时导致的内存泄漏。我用JProfiler对堆进行了快照,似乎至少我的一些静态变量没有被释放。 某些类有一个静态 final 成员,该成员在首次加载类时初始化,并且因为它是 final,所以我无法在应用程序关闭时将其设置为 null。 静态最终变量是Tomcat中的反模式,还是我错过了

  • 我正在编写一个spring boot 2应用程序,我正在使用SQL批量复制功能在SQL Server2012数据库中插入几条记录。每插入700行,我就有600 MB的泄漏 我已经试用了Microsoft驱动程序版本6.4.0.jre8和7.2.2.jre8,但任何东西都改变了。我尝试为tomcat更改Hikari连接池,但结果是一样的。 为了调用Microsoft API,我使用了包装器框架(ht

  • 我担心从泄漏金丝雀回来的信息。它显示了在UI上声明的所有变量,如片段中的材料按钮、材料卡片视图、文本视图、图像视图等,都导致了内存泄漏。我不知道为什么会这样。

  • 问题内容: 以下是我在CentOS机器上的Catalina.out文件中唯一条目的录入。我正在使用Spring 3和我的应用程序运行Tomcat 6。他们一整堆,所以我只是挑选了一些不断重复的东西。这并非一直发生,但至少每周发生一次。 问题是我该怎么做才能防止风箱发生? 问题答案: 当您定义一个外部标志时,应该在设置 该标志的同时轮询该线程并退出该线程。否则,该线程可能永远不会看到其他线程所做的更