【问题标题】:Hibernate mapping causes memory leakHibernate 映射导致内存泄漏
【发布时间】:2013-12-16 15:53:42
【问题描述】:

我有一个在 tomcat 中运行的 java web 应用程序,通过休眠与我的数据库通信。数据库上的字段 is_enabled 在数据库上映射为TINYINT,但hbm.xml 中的布尔值:

<property name="isEnabled" type="boolean">
        <column name="is_enabled"  />
</property>

我知道映射没有任何问题,因为我有另一列是 TINYINT(1),并在 hbm.xml 中映射为布尔值。但是当我添加这个属性时,我的 WAR 没有加载,并且在 Tomcat 中我得到了几个:

org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
 SEVERE: The web application [] appears to have started a thread name
 [Job_Executor2] but has failed to stop it.  This is very likely to
 create a memory leak.

知道如何进行调试吗?

【问题讨论】:

  • 我认为我们在这里缺少一些上下文。 Job_Executor2 是做什么的?
  • 您好,我高度怀疑您描述的内容可能会导致内存泄漏。 (或者更明显的是线程泄漏)。
  • @AdamArold 有多个线程导致问题..不仅仅是 Job_Executor2。
  • 您能否评论一下您是如何在 Hibernate 映射和日志消息之间建立联系的?对我来说,它们是无关的。

标签: java hibernate tomcat hibernate-mapping


【解决方案1】:

我知道映射没有问题,因为我还有另一列 这是一个 TINYINT(1) 并在 hbm.xml 中映射为布尔值。

仅通过查看布尔属性本身很难进行评论。也许看看整个 hbm.xml 可能会给出一个想法。此外,是否有在您的应用程序(或您的 servlet 或 bean 之一或您有什么)的初始化处执行的代码正在查看此属性并对其进行处理?

仅此属性不太可能是罪魁祸首。内存泄漏(或您的根本原因)可能已经存在,并且此属性的存在(以及休眠中的任何代码......或在您的应用程序中)导致过去临界点。

也就是说,罪魁祸首不是这个属性。它只是一种催化剂,可以让现有的软件或系统错误显现出来。

知道如何进行调试吗?

对于此类问题,最好使用专业的 ($$$) 分析工具,如 JProfiler。

但我也使用其他开源或免费工具来解决与内存相关的问题(由 Web 服务、休眠或其他问题引起)。有一些选项。

  1. Eclipse Memory Analyzer - 当我不得不从根本上导致代码与休眠交互的一些问题时,这个工具对我来说是天赐之物。

  2. VisualGCVisualVM - 这是两个截然不同但密切相关的工具,可以帮助您从根本上解决问题(或至少缩小问题所在。)

这样的事情需要多管齐下,您会发现自己使用多种工具给这只猫剥皮。

给出上面列出的这三个工具。希望他们有所帮助。

【讨论】:

    猜你喜欢
    • 2021-02-26
    • 1970-01-01
    • 2011-03-22
    • 2015-07-06
    • 2014-06-07
    • 2013-11-20
    • 2011-10-28
    • 2016-01-18
    • 2012-12-13
    相关资源
    最近更新 更多