1

私は自分のアプリでメモリリークを探していて、何らかの理由で列挙のインスタンスがヒープに保持されているという jhat を見つけました。

それをシミュレートするために、Tomcat にアプリをデプロイし、少し操作して停止し、Tomcat で (jconsole を介して) GC を実行しました。次に、ヒープダンプを取り、これを見つけました:

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

これがどのように起こるか考えていますか?

4

2 に答える 2

6

なぜ彼らはヒープにいないのでしょうか? これらは、他のすべてのオブジェクトと同様に、クラス (enum クラス) のインスタンスです。それは、それらがガベージコレクションされる可能性があるという意味ではありません。それらのクラスは、各インスタンスへの参照を保持します。

于 2011-08-22T14:01:22.290 に答える
2

enum インスタンスはstatic、通常のクラスのフィールドに沿って処理されると思います。つまり、クラスがロードされている限り、それらは強力に到達可能に保たれます。これは、列挙型の使用に伴う使いやすさのために必要です。

于 2011-08-22T14:02:42.170 に答える