6

Windows2003マシンでTomcat6を実行しています。このサーバーに2つのGrailsアプリをデプロイしましたが、デプロイ後にすべてがクラッシュし、従来のPermGenエラーが発生することにすぐに気付きました。

java.lang.OutOfMemoryError: PermGen space
 java.lang.ClassLoader.defineClass1(Native Method)
 java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
 java.lang.ClassLoader.defineClass(ClassLoader.java:616)
 org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.de 
...

だから私はこの問題の一般的な修正を見つけました:ヒープとpermgenスペースを増やす:

set CATALINA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m"

C:\ apache-tomcat-6.0.26 \ bin\catalina.batに追加されました。残念ながら、これは機能しませんでしたが、問題は、Tomcatがそれを取得しているかどうかわからないことです。さまざまなログを確認しましたが、これらのオプションが出力されません。それらをログに記録し、Tomcatがそれらを読み取ったことを確認する方法はありますか?

編集:tomcat6w.exeで次のJVMオプションを追加しようとしました:

-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled 
-XX:+UseConcMarkSweepGC

そして何も変わっていません。2〜3分の稼働時間後にpermGenを取得します。他のアイデアはありますか?

乾杯!ムローン

4

4 に答える 4

6

皆さん、ありがとうございました!私は最終的に次のように追加して問題を解決しました。

-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
-XX:+UseConcMarkSweepGC
-XX:PermSize=128m
-XX:MaxPermSize=512m 

tomcat6w.exeのJavaオプションへ。

ありがとう!

于 2010-08-30T12:58:55.090 に答える
4

それを行う実際の方法(Catalina.bat内)、

set "JAVA_OPTS=-Djava.awt.headless=true -server -Xms512m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"

この行をそのような位置に追加して、このJAVA_OPTSがファイルの最後にある_EXECJAVAコマンドのいずれかに転送されるようにします(そうでない場合はネストされています)。私は個人的にこの行をこのバッチの最初のステートメントとして書きます

于 2014-02-17T04:59:22.557 に答える
1

サーバーを起動する前に、実際にそれらをJVMのJAVA_OPTSとして設定しました

JAVA_OPTS=-Djvmarg='-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m'
于 2010-08-27T15:57:22.830 に答える
0

設定している場所を確認し、トラブルシューティングに使用echo [statements]して、VMに渡される直前に設定してみてください。

set CATALINA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m"
_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% 
-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" 
-Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" 
-Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

EXEC_JAVA自分が持っているファイルのバージョンがわからない権利があることを確認してください。.batただし、おそらくいくつかのifステートメントがあります。

また、これらがVMの有効な引数であることを確認してください。

Javaコード内で最大ヒープサイズを確認できます。次を使用します。

long heapMaxSize = Runtime.getRuntime().maxMemory();

印刷するだけです。設定に基づいて正しい場合は、メモリリークがひどいですが、そうでない場合は、それtomcatを取得していません。

于 2010-08-27T11:50:58.330 に答える