11

最近発生している outOfMemory PermGen の問題に苦しんでいます。エラーが発生したときに保存されたログ スニペットの 1 つ:

java.lang.OutOfMemoryError: PermGen space
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.findClass(ModuleImpl.java:1872)
        at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:720)
        at org.apache.felix.framework.ModuleImpl.access$300(ModuleImpl.java:73)
        at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1733)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

最大パーマ サイズを増やしまし-XX:MaxPermGen=128mたが、ここで何らかのメモリ リークが発生していると確信しているため、これは一時的な解決策にすぎません。アプリケーションの Web パーツは、jetty (jsf + icefaces) にデプロイされます。ランダムなコンポーネントをクリックすると、使用されるメモリが増加しますjstat -gcold. -XX:+TraceClassLoadingjvm params に追加したところ、Web ユーザー インターフェイスでアクションが発生すると、多くのログが記録されますsun.reflect.GeneratedConstructorAccessorsun.reflect.GeneratedMethodAccessorpermgen の 99% が使用されたときに、ヒープ ダンプも作成しました。YourKit プロファイラーを使用してヒープを分析しました。クラスローダータブにはsun.reflect.DelegatingClassLoader、それぞれに1つのクラスを持つ行がたくさんあります。メモリが常に増加している原因は何ですか? どんな助けでも本当に感謝します。

前もって感謝します、ルカシュ

4

5 に答える 5

5

Sun JVM では、プロパティとメソッドへのリフレクション アクセスは、JNI を介して JVM 実装を呼び出すことによって最初に実行されます。JVM は、メソッドまたはフィールドがリフレクションによって頻繁にアクセスされていることに気付くと、同じことを行うバイトコードを生成します。これは、「インフレ」と呼ばれるメカニズムです。これで初速は出ますが、その後は約20倍速く走ります。反省をたくさんすれば大勝利。

そのバイトコードは、DelegatingClassLoader インスタンスによって作成されたクラスに存在し、permgen スペースを占有します。これが問題になる場合は、システム プロパティの sun.reflect.inflationThreshold を 0 (ゼロ) に設定して、インフレをオフにすることができます。

于 2012-01-09T13:54:13.837 に答える
4

まず、これは特に JSF とは関係ありません。webapp のニーズと比較して、appserver に与えるメモリが少なすぎるだけです。カバーの下で反射の良いショットを使用する他のすべてのフレームワークで同じ問題が発生します(これらすべてのEL解決を考えてください)。これは、JSF、Wicket、Spring-MVC、さらにはプレーンな JSP/サーブレットにすることができます。この可能性は、JSF (およびその他) などの EL リゾルバーに大きく依存するコンポーネント ベースの Web フレームワークでのみ大きくなります。

さらに、Tomcat (ベースの) サーバーも、(ホット) 再デプロイを頻繁に行うと、この問題を引き起こす可能性があることが知られています。次のリンクを参照して、その詳細と対処方法を確認してください。

于 2011-02-21T15:31:37.483 に答える
1

まず第一に、これを徹底的に調査し、さらに優れた質問を書いてくれたことに感謝します。誰もがあなたと同じくらい才能があり、優れた作家であれば、世界 (およびこのサイト) はより良い場所になります.

あなたはすでに答えを見つけていると思います.JSFとそのリフレクションの使用があなたの問題だと思います.

これが、私が疫病のように JSF を避ける理由の 1 つです。

私の意見では、JSF は Struts の失敗した拡張です。HTML/CSS/JavaScript/AJAX の UI は、JSF と同じかそれ以上の能力があり、JVM への負担がはるかに少ないと考えています。UI はサービスを呼び出し、サーバー側から切り離された状態を保ちます。

于 2011-02-21T12:49:18.863 に答える
0

通常、Permgen の問題は、多くの String.intern() 操作を実行するプロセスによって引き起こされます。一部の XML/HTML ジェネレーターとパーサーは、これに罪を犯しています。最初にそこを見てください。すぐに犯人を突き止めることができます。

于 2011-02-21T13:35:08.953 に答える