web-dev-qa-db-ja.com

TomcatのPermGenスペースエラー

Windows環境で作業しています。そして、Tomcatで作業しているときに毎回このエラーが発生しています

Apr 30, 2012 5:30:37 PM org.Apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
Java.lang.OutOfMemoryError: PermGen space
2012-04-30 17:30:37.719 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for Sun.nio.ch.SelectionKeyImpl@4ae53a99
2012-04-30 17:30:37.719 INFO net.spy.memcached.MemcachedConnection:  Reconnecting due to failure to connect to {QA sa=localhost/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0}
Java.net.ConnectException: Connection refused: no further information
Apr 30, 2012 5:30:37 PM org.Apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
Java.lang.OutOfMemoryError: PermGen space
Exception in thread "Memcached IO over {MemcachedConnection to localhost/127.0.0.1:11211}" Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.Apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.Apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.Apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:41 PM org.Apache.catalina.connector.CoyoteAdapter service
SEVERE: An exception or error occurred in the container during the request processing
Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:43 PM org.Apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[exceptionType=Java.lang.Throwable, location=/error.action]
Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:42 PM org.Apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[exceptionType=Java.lang.Throwable, location=/error.action]
Java.lang.OutOfMemoryError: PermGen space
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" Java.lang.OutOfMemoryError: PermGen space

システム変数にJava_OPTS with the value as -Xms1024m -Xmx1024mを追加しようとしましたが、同じエラーがまだ発生しています(Java.lang.OutOfMemoryError:PermGen space)任意の助けをいただければ幸いです。 stackoverflowの他の記事も読んでいますが、うまくいきませんでした。

53
AKIWEB

PermGenスペースは、Tomcatがクラス定義(定義のみ、インスタンス化なし)およびインターンされた文字列プールを格納するために使用するものです。経験から、TomcatはWARをデプロイするかjspc(jspファイルを編集するとき)を行うたびに新しいクラスをロードする必要があるため、PermGenスペースの問題は開発環境で頻繁に発生する傾向があります。個人的に、私は開発テスト中に多くの戦争を展開し、再展開する傾向があるので、遅かれ早かれ使い果たすことになると確信しています(主にJavaのGCサイクルはいまだにくだらないので、戦争を迅速かつ頻繁に再展開する場合十分に、スペースは管理できるよりも早くいっぱいになります)。

あなたは(できれば)コードベースを10分ごとに変更しないので、これは理論的には本番環境では問題になりません。それでも発生する場合は、コードベース(および対応するライブラリの依存関係)が既定のメモリ割り当てに対して大きすぎることを意味し、スタックとヒープの割り当てをいじるだけです。標準は次のようなものだと思います:

-XX:MaxPermSize=SIZE

ただし、PermGenが実行されないようにクラスをアンロードできるようにすることは、これを適切に処理する最善の方法であることがわかりました。

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

そのようなものは、過去に私にとって魔法のように働いた。 1つのことは、permgenスイープは、あなたが行うすべてのリクエストまたはそれらの線に沿った何かに対して余分な2つのリクエストのようになるので、それらを使用することでパフォーマンスの大きなトレードオフがあります。使用とトレードオフのバランスを取る必要があります。

107
Michael

Tomcat JVMのPermGenSpaceにより多くのスペースを割り当てる必要があります。

これは、JVM引数を使用して実行できます。-XX:MaxPermSize = 128m

デフォルトでは、PermGenスペースは64Mです(また、コンパイル済みのすべてのクラスが含まれているため、クラスパスに多くのjar(クラス)がある場合、実際にこのスペースを埋めることができます)。

補足として、 JVisualVM でPermGenスペースのサイズを監視でき、 YourKit Java Profiler でそのコンテンツを検査することもできます。

17
SRG

Michaelの答えを補完するために、そして this answer に従って、問題に対処する安全な方法は次の引数を使用することです:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC
10
Rafael

TomcatがWindowsサービスとして実行されている場合、CATALINA_OPTSもJava_OPTSも効果がないようです。

GUIのJavaオプションで設定する必要があります。

以下のリンクはそれをうまく説明しています

http://www.12robots.com/index.cfm/2010/10/8/Giving-more-memory-to-the-Tomcat-Service-in-Windows

5
user2484733

Tomcat 7.0 Windowsサービスインストーラーバージョンでは、/ binにcatalina.batはありません。したがって、Tomcat7w.exeを/ binで開き、ブローJVM引数を追加する必要があります

-XX:PermSize=256m -XX:MaxPermSize=512m

on Java Option in Java Tab、このよう。他のオプションも追加します。

enter image description here

もう1つは、IntellijIDEAを使用する場合、このようにサーバー構成にJVM引数を追加する必要があります。

enter image description here

2
saneryee

@AndreSmileyの行コードは私のために働いた。

必要な変更のみです。

-XX:MaxPermSize = 256 m

「m」はMBを意味します。

実際、私のアプリケーションはちょっと巨大なので、パフォーマンスのために1024mにすることをお勧めしました。

2

これは私のために、startup.bat次の行が存在しない場合は追加する必要がありますset Java_OPTSと値-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256。フルライン:

set Java_OPTS=-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256
2
AndrewSmiley

CentOS 6.6でTomcat7を実行しています。新しい/usr/share/Tomcat/bin/setenv.shファイルを作成し、両方を設定してみましたJava_OPTSおよびCATALINA_OPTS。ただし、Tomcatは再起動時に値を取得しません。次の行を/etc/Tomcat/tomcat.confに追加すると:

CATALINA_OPTS="-Xms128m -Xmx1024m -XX:MaxPermSize=1024m"

Tomcatは新しい環境変数を選択しました。実行してこれを確認しました

ps aux | grep Tomcat

出力で新しい設定を確認します。これは診断に長い時間がかかり、他の誰かがこれを示唆しているのを見ていなかったので、私はそれをインターネットコミュニティに投げ出すと思った。

1
Barry H

TomcatでEclipseを使用している場合は、以下の手順に従ってください

  1. サーバーウィンドウでTomcatをダブルクリックすると、Tomcatの概要ウィンドウが開きます。

  2. 概要ウィンドウでは、起動設定を開く一般情報および起動設定を開くをクリックします。

  3. [構成の編集]ウィンドウでArgumentsを探し、それをクリックします。
  4. Argumentsタグで、VM argumentsを探します。
  5. これを貼り付けるだけです-Xms256m -Xmx512m -XX:PermSize = 256m -XX:MaxPermSize = 512m引数の終わり。

edit launch configuration properties

Intellij Ideav11でも同じことを試しました。

Grepを使用してプロセスをチェックした後、設定を取得していませんでした。そうでない場合は、代わりにcatalina.shでJava_OPTSのmem設定を指定します。

0
Sujal Shelke