1

java.lang.OutOfMemory: PermGen数日前、 Tomcat で Java Web サイトを実行すると例外が発生することがあることに気付きました。

このエラーについてオンラインで読み、この例外が発生する理由を理解しました。チュートリアルに従って を増やし、次の内容を含むようにMaxPermSize編集しました。catalina.sh

    JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 
    -server -Xms1536m -Xmx1536m
    -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m 
    -XX:MaxPermSize=256m -XX:+DisableExplicitGC"

ただし、PermGen の機能についてもっと理解したいと思います。

  1. 適切な新しいサイズを与えるために、サーバーの機能を理解する方法を誰か教えてもらえますか?

  2. さらに、Apache tomcat でメモリを測定する方法を知っている人はいますか?

4

6 に答える 6

1

これは一般的な問題であり、適切な解決策はありません。

通常、Permgen の問題は、実行中の Tomcat インスタンスにホット再デプロイを行う際のストレージ リークが原因で発生します。これは通常、再デプロイしたクラスの 1 つのインスタンスであるオブジェクトへの参照が保持されている場合に発生します。これにより、古いクラスローダーとそれがロードしたすべてのクラスがリークします...

これに対処するには、次の 3 つの方法があります。

  • Permgen のメモリ リークを追跡して修正します。
  • Tomcat を定期的に再起動します。
  • ホット再デプロイを行わないでください。

Permgen を増やしても問題は解決しません。それはただそれを先延ばしにするだけです...あなたのTomcatがそれほど頻繁に死なないように。

于 2012-07-02T15:28:07.023 に答える
1

JConsole を試してメモリ使用量を監視できます。

http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html

于 2012-07-02T15:30:08.053 に答える
1

PermGen は、ガベージ コレクターによって管理されないメモリの領域です。ロードされたクラス、そのメソッド、静的、文字列などが含まれています...

Xmx が 1536Mo の場合、MaxPermSize を 384M に設定できます。値が高すぎると、JVM が開始されないため、最大サイズを簡単に見つけることができます。

しかし、本当の問題は、なぜ PermGen がこれほどまでにいっぱいなのかということです。多くのクラスをロードしますか?

于 2012-07-02T15:30:49.707 に答える
0

JVM に十分なメモリが割り当てられていないため、メモリ不足が発生します。

何が起こっているのかをよりよく把握するには、おそらくプロファイラーを試すのが理にかなっています。私はラムダ プローブNew Relic (現在、試用用に無料のシャツを提供しています) を使用したことがありますが、他にも多くのプローブがあります。

于 2012-07-02T15:27:47.713 に答える
0

ガベージ コレクターのパフォーマンスを追跡し、ヒープ サイズを監視するには、GC ログを有効にすることをお勧めします。

-Xloggc: -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

これによりログ ファイルが生成され、ヒープのサイズ設定に適した設定を取得できます。

于 2012-07-02T15:32:30.103 に答える