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の他の記事も読んでいますが、うまくいきませんでした。
PermGenスペースは、Tomcatがクラス定義(定義のみ、インスタンス化なし)およびインターンされた文字列プールを格納するために使用するものです。経験から、TomcatはWARをデプロイするかjspc(jspファイルを編集するとき)を行うたびに新しいクラスをロードする必要があるため、PermGenスペースの問題は開発環境で頻繁に発生する傾向があります。個人的に、私は開発テスト中に多くの戦争を展開し、再展開する傾向があるので、遅かれ早かれ使い果たすことになると確信しています(主にJavaのGCサイクルはいまだにくだらないので、戦争を迅速かつ頻繁に再展開する場合十分に、スペースは管理できるよりも早くいっぱいになります)。
あなたは(できれば)コードベースを10分ごとに変更しないので、これは理論的には本番環境では問題になりません。それでも発生する場合は、コードベース(および対応するライブラリの依存関係)が既定のメモリ割り当てに対して大きすぎることを意味し、スタックとヒープの割り当てをいじるだけです。標準は次のようなものだと思います:
-XX:MaxPermSize=SIZE
ただし、PermGenが実行されないようにクラスをアンロードできるようにすることは、これを適切に処理する最善の方法であることがわかりました。
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
そのようなものは、過去に私にとって魔法のように働いた。 1つのことは、permgenスイープは、あなたが行うすべてのリクエストまたはそれらの線に沿った何かに対して余分な2つのリクエストのようになるので、それらを使用することでパフォーマンスの大きなトレードオフがあります。使用とトレードオフのバランスを取る必要があります。
Tomcat JVMのPermGenSpaceにより多くのスペースを割り当てる必要があります。
これは、JVM引数を使用して実行できます。-XX:MaxPermSize = 128m
デフォルトでは、PermGenスペースは64Mです(また、コンパイル済みのすべてのクラスが含まれているため、クラスパスに多くのjar(クラス)がある場合、実際にこのスペースを埋めることができます)。
補足として、 JVisualVM でPermGenスペースのサイズを監視でき、 YourKit Java Profiler でそのコンテンツを検査することもできます。
Michaelの答えを補完するために、そして this answer に従って、問題に対処する安全な方法は次の引数を使用することです:
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC
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
@AndreSmileyの行コードは私のために働いた。
必要な変更のみです。
-XX:MaxPermSize = 256 m
「m」はMBを意味します。
実際、私のアプリケーションはちょっと巨大なので、パフォーマンスのために1024mにすることをお勧めしました。
これは私のために、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
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
出力で新しい設定を確認します。これは診断に長い時間がかかり、他の誰かがこれを示唆しているのを見ていなかったので、私はそれをインターネットコミュニティに投げ出すと思った。
Intellij Ideav11でも同じことを試しました。
Grepを使用してプロセスをチェックした後、設定を取得していませんでした。そうでない場合は、代わりにcatalina.shでJava_OPTSのmem設定を指定します。