27

背景:私はJSPを使用するWebプロジェクトを持っています。IDE は Eclipse です。tomcatの設定は、リソース変更時に自動公開し、公開間隔は「1秒」です。

一部の設定を保存するために使用されるクラス フォルダー内のプロパティ ファイル。サーブレットによって動的に変更することもできます。変更操作は、JSP の保存ボタンによってトリガーされます。

問題: いくつかの保存操作の後、Tomcat にjava.lang.OutOfMemoryError: PermGen space.

ログメッセージ

java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1815)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:108)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:58)
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:297)
    at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1064)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3083)
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:404)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1279)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560)
    at java.lang.Thread.run(Thread.java:662)
4

7 に答える 7

34

Tomcat は多くの permgen を必要とします。512m は不当な最大値ではありません。ただし、ホット デプロイ リークを遅らせるだけです。Permgen は hotdeploy ごとに最大 25MB 大きくなりますが、これは Eclipse では Java ファイルを保存するたびに発生する可能性があります。私のように Ctrl+S の単収縮があれば、512m はすぐに消えます。

解決策: Java がクラス定義をメモリから追い出すことができるようにします。つまり、ガベージ コレクション バイト コードです。ブーストされた permgen サイズとともにこれらを追加します。

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC
于 2012-04-20T15:18:20.063 に答える
15

: " JAVA_OPTS" という名前の環境変数を設定し、その値を次のように設定できます。-Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m

于 2012-04-10T08:52:52.383 に答える
5

次のように設定します。

-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m

ここに画像の説明を入力

于 2015-07-16T02:48:37.790 に答える
0

Tomcat サーバーは別の JAVA を実行し、Eclipse は別の JAVA で実行されます。

したがって、に追加-XX:MaxPermSize=512mするeclipse.iniと、この問題の解決に役立ちます。以下の手順に従って、これを tomcat サーバーに追加します。

  • Eclipseでサーバーをダブルクリック

  • 起動構成を開く

  • Arguments タブの VM 引数に「-XX:MaxPermSize=512m」を追加します。

于 2016-04-07T10:14:36.650 に答える