54

私は 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)が何度も発生します。

どんな助けでも大歓迎です。Stack Overflow の他の投稿も読みましたが、うまくいきませんでした。

4

11 に答える 11

107

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

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

-XX:MaxPermSize=SIZE

しかし、それをうまく処理する最善の方法は、PermGen が不足しないようにクラスをアンロードできるようにすることです。

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

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

于 2012-05-01T01:06:49.160 に答える
17

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

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

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

ちなみに、JVisualVMを使用してPermGenスペースのサイズを監視でき、YourKitJavaProfilerを使用してそのコンテンツを検査することもできます

于 2012-05-01T00:57:52.353 に答える
10

Michael の回答を補完するために、この回答によれば、問題に対処する安全な方法は、次の引数を使用することです。

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC
于 2013-10-29T10:10:38.843 に答える
5

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

于 2014-09-26T08:19:15.297 に答える
2

@AndreSmiley の回線コードは私にとってはうまくいきました。

必要な変更のみです。

-XX:MaxPermSize= 256m

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

実際、私のアプリケーションはちょっと大きいので、パフォーマンスのために 1024m にするように勧められました。

于 2015-10-15T22:51:14.733 に答える
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
于 2015-06-29T14:02:30.650 に答える
1

CentOS 6.6 で tomcat7 を実行しています。新しい /usr/share/tomcat/bin/setenv.sh ファイルを作成して、 と の両方を設定してみましJAVA_OPTSCATALINA_OPTS。しかし、Tomcat は再起動時に値を取得しません。次の行を /etc/tomcat/tomcat.conf に入れると:

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

tomcat は新しい環境変数を取得しました。実行してこれを確認しました

ps補助 | グレップトムキャット

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

于 2016-02-05T09:31:22.617 に答える
1

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

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

  2. [概要] ウィンドウの[一般情報]の下に [起動構成を開く] が表示され、 [起動構成を開く] をクリックします。

  3. 構成の編集ウィンドウで、引数を探してクリックします。
  4. 引数タグでVM 引数を探します。
  5. この -Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512mを引数の末尾に貼り付けるだけです。

起動構成プロパティの編集

于 2016-02-04T06:29:34.693 に答える