6

Glassfish3.1でGWT+Hibernateアプリを実行しています。数時間後、Permgenのスペースが不足しました。これは、Webアプリのリロードなしです。で実行してい–XX:MaxPermSize=256m –XmX1024mます。

このページからアドバイスを受けたところ、大量のクラスがリークしていることがわかりました。すべてのHibernateモデルとすべてのGWTRequestFactoryプロキシです。

上記のガイドには、「チェーンを検査し、誤った参照を見つけて、コードを修正する」と書かれています。言うのは簡単です。

クラスローダーは常にのインスタンスを指しますorg.glassfish.web.loader.WebappClassLoader$Proxy135さらに掘り下げてみると、似たような名前のオブジェクトからの参照がたくさん見つかります。しかし、私は他にどのようにフォローするかわかりません。

4

4 に答える 4

22

新しいクラスオブジェクトはPermGenに配置されるため、ますます多くのスペースを占有します。PermGenスペースをどれだけ大きくしても、十分な展開を行うと必然的に最大になります。あなたがする必要があるのはあなたがそのサイズを安定させることができるようにPermGenを洗い流すための措置をとることです。このクリーニングを処理する2つのJVMフラグがあります。

-XX:+CMSPermGenSweepingEnabled

この設定には、ガベージコレクションの実行にPermGenが含まれます。デフォルトでは、PermGenスペースがガベージコレクションに含まれることはありません(したがって、無制限に拡張されます)。

-XX:+CMSClassUnloadingEnabled

この設定は、PermGenガベージコレクションスイープにクラスオブジェクトに対してアクションを実行するように指示します。デフォルトでは、ガラベージコレクション中にPermGenスペースにアクセスしている場合でも、クラスオブジェクトは免除されます。

于 2011-04-01T05:25:12.073 に答える
4

あなたはそれを決して知らないでしょうが、これを助けるためのいくつかのOKツールがあります。JDK(1.6 u1以降)には、jhatおよびjmapが付属しています。これらのツールは、特にjhatJavaScriptクエリサポートを使用する場合に非常に役立ちます。

見る:

http://blog.ringerc.id.au/2011/06/java-ee-application-servers-learning.html

http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

http://www.mhaller.de/archives/140-Memory-leaks-et-alii.html

http://blogs.oracle.com/sundararajan/entry/jhat_s_javascript_interface

于 2011-06-26T11:17:38.380 に答える
4

私はTomcatに移行することでこれを「解決」しました。

于 2012-10-21T01:44:07.297 に答える
2

(Websenseによってブロックされているため、提供されたリンクを表示できません。そのため、何かを言い換える場合は、お詫び申し上げます)

クラスローダーのリークがあるようです。これらを追跡するのは困難です。これらのオプションをインスタンス構成のJVMオプションに追加してください

-XX:+PrintGCDetails
-XX:+TraceClassUnloading
-XX:+TraceClassLoading

これで、アプリを実行するときに、domain / logsフォルダーにあるjvm.logを調べて、何がロードおよびアンロードされているかを確認できます。ほとんどの場合、同じクラスが何度もロードされているのがわかります。

良い原因はJAXBです。特に、新しいJAXBContextを何度も作成している場合はそうです。

于 2011-04-06T22:30:26.017 に答える