分析java heapdumps:为什么枚举实例保存在堆中?

时间:2011-08-22 13:59:38

标签: java enums heap-memory heap-dump

我一直在寻找我的应用程序中的内存泄漏,并且使用jhat,因为某些原因,枚举的实例保存在堆中。

为了模拟它,我已经在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

知道如何发生这种情况吗?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

我相信枚举实例被视为普通类的static字段的行 - 也就是说,只要加载了类,它们就会保持强可访问性。这对于使用枚举时的易用性是必要的。