【问题标题】:Analysing java heapdumps: why are enum instances kept in heap?分析java heapdumps:为什么枚举实例保存在堆中?
【发布时间】:2011-08-22 13:59:37
【问题描述】:

我一直在寻找我的应用程序中的内存泄漏,并发现由于某种原因枚举实例保留在堆中。

为了模拟它,我在 tomcat 中部署了我的应用程序,对其进行了一些处理,停止了它并在 tomcat 上执行了 GC(通过 jconsole)。然后拿了一个堆转储,发现了这个:

instance of x.mgbean.quote.Input$Tab@0xe0887c0 (16 bytes)
Class:
class x.mgbean.quote.Input$Tab
Instance data members:
name (L) : VEHICLE (24 bytes)
ordinal (I) : 0
References to this object:
java.util.HashMap$Entry@0xe15f7c0 (24 bytes) : field value
class x.mgbean.quote.Input$Tab (84 bytes) : static field VEHICLE
[Lx.mgbean.quote.Input$Tab;@0xe0887f0 (20 bytes) : Element 0 of  [Lx.mgbean.quote.Input$Tab;@0xe0887f0
[Lx.mgbean.quote.Input$Tab;@0xe1541e8 (20 bytes) : Element 0 of  [Lx.mgbean.quote.Input$Tab;@0xe1541e8

知道这是怎么发生的吗?

【问题讨论】:

    标签: java enums heap-memory heap-dump


    【解决方案1】:

    为什么它们不在堆中?与所有其他对象一样,它们是类(枚举类)的实例。这并不意味着它们可以被垃圾收集。他们的类持有对每个实例的引用。

    【讨论】:

    • 好吧,我已经停止了 web 应用程序,没有必要让任何类仍然在堆中。所以我想知道为什么它们仍然存在。
    • 您是取消部署还是直接停止?也许在取消部署应用程序之前,Tomcat 不会使类加载器无法访问?
    【解决方案2】:

    我相信枚举实例是按照普通类的static 字段的方式处理的——也就是说,只要加载了类,它们就可以保持很强的可访问性。这对于使用枚举带来的易用性是必要的。

    【讨论】:

      猜你喜欢
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2015-12-31
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多