2012-04-08 10 views
2

サーバ(tomcat)上の同じwar-fileの展開 - 展開解除アクションが繰り返し実行される場所がPermGen OutOfMemoryErrorになっています。私の目標は、戦争が展開されていないときにすべてのクラスをアンロードすることです。ここでJavaプロファイリングPermgen:javaクラス内で列挙型をアンロードする方法

は、私が持っているクラスです。

public class ClassA { 
//static variables & methods 
//instance variables & methods 

    private EnumInsideClassA myState = EnumInsideClassA.VALUE1; 

    private enum EnumInsideClassA 
    { 
     VALUE1, 
     VALUE2 
    } 
} 

私はにClassAの参照をすべてクリアしたとき、私はにClassAを見ることができなかったとの戦争がアンデプロイされたとき、それがアンロードされました。しかし、私はまだenum参照を参照し、ClassA $ EnumInsideClassAはアンロードされません。

あり「myState」インスタンス変数にはゲッターがありませんし、それだけですべてのヘルプは

+0

あなたはJVMの引数を試してみました_ " - XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabled" _? これは同様の質問です:[link](http://stackoverflow.com/questions/88235/how-to-deal-with-java-lang-outofmemoryerror-permgenspace-error) – samlewis

+0

ありがとうございました。はい、私はしばらく前にそれを試しました。そして私はもう一度それを試しました。ただし、内部クラス(Enum)はクリーンアップされていません。もう1つは、ClassAがこれらのJVMオプションを使用してアンロードされていることです。 – Chris

答えて

1

を高く評価しているにClassA

で使用することになるだろうしかし、私はまだ列挙参考文献を参照してにClassA $ EnumInsideClassAがありますアンロードされません。

enumの参照が表示されている場合は、その参照先がわかるはずです。 enumクラスの隠された静的フィールドを介してアクセス可能ないくつかのenum参照が存在しますが、これらは循環参照である必要があり、enumに到達可能な状態にしてはいけません。別の場所にenumの参照があるかどうかを確認してください。

+0

ClassLoader内のVector内の参照を参照してください。私はそれを自分の世襲の階層には見ません。 – Chris

+0

'enum'値への参照?どのようにすることができますか?なぜクラスローダーは 'enum'値について知る必要がありますか? –

+0

私が理解するように、各列挙型ごとに1つのオブジェクトが作成され、このタイプの列挙型を使用するすべてのオブジェクトが作成されます。私が間違っている場合は私を修正してください。enumはクラスの一種(それが別の.classファイルを持つことを意味する)としても遵守されます。列挙型をロードしているクラスローダーはその定義とオブジェクトを持っています – Chris

1

問題は、列挙型インスタンスがクラスローダーによってアンロードされないことが原因と思われます。私はテストサーブレットプロジェクトを持っており、そのすべてがenumです。プライベートクラスまたはインナークラスの列挙型である必要はありませんが、インスタンスが作成されるために少なくとも1回は参照する必要があります。 jvmがenumを特別なものとして扱っていないのは事実です。私は静的インスタンス(つまり、カスタムクラスの静的インスタンスはクラスローダーのアンロード時にガベージコレクションを取得しない)と同じ問題を認識します。

さまざまな-XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabledを試しましたが、成功しませんでした。これはJVM固有のものかもしれません(私はMac OS X上にあり、それらのオプションはないようですが、-Xincgcはどちらでも動作しませんでした:http://developer.apple.com/library/mac/#documentation/Java/Reference/Java_VMOptionsRef/Articles/JavaVirtualMachineOptions.html)。 Dealing with "java.lang.OutOfMemoryError: PermGen space" error

おそらく、この特定の問題(サーブレット再デプロイメント)の最も良い解決策は、すべての列挙型をアンロードする必要のないjarに入れることです。

FIY:私の環境は、Mac OS X 10.6.8で、Javaの1.6.0_31

関連する問題