Анализ java heapdumps: почему экземпляры enum хранятся в куче? - PullRequest
1 голос
/ 22 августа 2011

Я искал утечки памяти в моем приложении и выяснил, что по какой-то причине экземпляры перечислений хранятся в куче.

Чтобы смоделировать его, я развернул свое приложение в tomcat, немного поработал с ним, остановил его и выполнил GC на tomcat (через 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 ]

6 голосов
/ 22 августа 2011

Почему бы им не быть в куче? Они являются экземплярами класса (enum class), как и все другие объекты. Это не значит, что они могут быть собраны мусором. Их класс содержит ссылку на каждый из экземпляров.

2 голосов
/ 22 августа 2011

Я полагаю, что экземпляры enum обрабатываются в соответствии с полями static для обычного класса, то есть, пока класс загружен, они остаются сильно достижимыми.Это необходимо для простоты использования при использовании перечислений.

...