web-dev-qa-db-ja.com

java.lang.OutOfMemoryError:PermGenスペース

Eclipseで頻繁に次のエラーが発生していますIDE 3.2、これらのOutOfMemoryからアプリケーションを保存するにはどうすればよいですか?

Java.lang.OutOfMemoryError: PermGen space
    Java.lang.ClassLoader.defineClass1(Native Method)
    Java.lang.ClassLoader.defineClassCond(Unknown Source)
    Java.lang.ClassLoader.defineClass(Unknown Source)
    Java.security.SecureClassLoader.defineClass(Unknown Source)
    org.Apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.Java:1814)
    org.Apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.Java:872)
    org.jboss.web.Tomcat.service.WebAppClassLoader.findClass(WebAppClassLoader.Java:75)
    org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1325)
    org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1204)
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.Java:289)
    Java.sql.DriverManager.getConnection(Unknown Source)
    Java.sql.DriverManager.getConnection(Unknown Source)
    org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.Java:133)
    org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.Java:111)
    org.hibernate.cfg.Configuration.buildSettings(Configuration.Java:2101)
    org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1325)
    com.mfic.util.HibernateUtil.<clinit>(HibernateUtil.Java:16)
    com.mfic.dao.BaseHome.getSession(BaseHome.Java:16)
    com.mfic.core.helper.UserManager.findByUserId(UserManager.Java:248)
    com.mfic.core.action.Login.authenticate(Login.Java:39)
    Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    Java.lang.reflect.Method.invoke(Unknown Source)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.Java:441)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.Java:280)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.Java:243)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.Java:165)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.Java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.Java:237)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.Java:252)
    org.Apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.Java:68)
33
Ganesamoorthy

セカンダリEclipseアプリケーションで疑問のあるエラーが発生している場合、ini-XX:MaxPermSize=512mを追加しても役に立ちません。 debug or run configuration->argumentsに移動して、その部分をVM引数に追加する必要があります。

-Dosgi.requiredJavaVersion=1.5 -Xms120m -Xmx2048m -XX:MaxPermSize=1024m

助けた。

編集。私が見つけたいくつかの実験の後、Eclipseはiniファイルからメモリ制限を取ります。しかし...新しいワークスペースの作成時に一度だけ実行されます。 Eclipse.iniの-vmargからのパラメーターは、デフォルトのVM parameters行を作成します。したがって、既存のワークスペースで作業している場合は、デバッグまたは実行構成を変更します。より良い未来。

36
Gangnus

プロジェクトは多くのメモリを消費します。 Eclipseで使用するメモリを増やします。編集Eclipse.ini以下の行を変更または追加します-vmargs

-Xms256m 
-Xmx512m 
-XX:MaxPermSize = 512m 

少なくとも2GBのRAMがあると仮定します。

こちらもご覧ください:

20
BalusC
  • [サーバーインスタンス]をクリックします。
  • 起動構成を開きます。
  • 引数タブで、JVMのメモリを増やします。

-Xms64m -Xmx256m

以下の画像を参照してください。

enter image description here

19

Javaアプリケーションは、限られた量のメモリしか使用できません。特定のアプリケーションが使用できるメモリの正確な量は、アプリケーションの起動時に指定されます。物事をより複雑にするために、Javaメモリは異なる領域に分離されており、その1つはPermGenと呼ばれています。

これらすべての領域のサイズは、JVMの起動時に設定されます。サイズを明示的に設定しない場合、プラットフォーム固有のデフォルトが使用されます。

だから-Java.lang.OutOfMemoryError: PermGen spaceメッセージは、メモリ内の永続サイズ領域が使い果たされているであることを示します。

PemGenと呼ばれるこの特定の領域は、Javaクラスがロードおよび保存される専用の領域です。これは、次のもので構成されます。

  • クラスの名前
  • クラスのフィールド
  • メソッドのバイトコードを持つクラスのメソッド
  • 定数プール情報
  • クラスに関連付けられたオブジェクト配列と型配列
  • Just In Timeコンパイラーの最適化

それはほとんどそれです。もう少し細かく分割しますが、実際のメモリ消費に数パーセント以上は影響しません。これらはすべてパーマネント世代に割り当てられ、パーマネント世代にとどまります。

ご覧のとおり、永続的な世代サイズの要件は、ロードされるクラスの数とそのようなクラス宣言のサイズの両方に依存します。そのため、このようなエラーの主な原因は簡単にわかります。クラスが多すぎるか、永続クラスにロードされるクラスが大きすぎる

症状の迅速な修正は簡単です-ヒープ内のPermGen領域を使い果たした場合、そのサイズを増やす必要があります。このソリューションは、JVMに十分なエルボルームを与えていない場合に役立ちます。そのため、アプリケーションの起動構成を変更し、以下を追加(または存在する場合は増加)します。

-XX:MaxPermSize=512m
5
Ivo

これは、デバッグセッションなどでEclipse内でTomcatを実行する場合にかなり頻繁に発生します。メモリからは、Sun JVMの問題です。アニーウェイ、簡単な修正があります:

Eclipse.iniの-vmargsの下に以下を追加します(Eclipseバイナリと同じディレクトリにあります)。

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

これにより、Eclipseの実行中に積極的なガベージコレクションが可能になり、Eclipseで単にRAMを追加するよりも洗練されたソリューションになります。

お役に立てれば!

2
Sam Day

上記の答えはおそらくあなたのためにそれを解決しますが、とにかくいくつかの興味深い関連リンクがあります:

このエラーに関する多くの議論と提案を含む記事を次に示します。 http://www.jroller.com/agileanswers/entry/preventing_Java_s_Java_lang

Permgen OOMエラーの発生例の説明: http://blogs.Oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_Java

以下は、最近StackOverflowに投稿された実際のソリューションです。 Tomcat用ですが、Eclipseで使用できる場合があります。 「Java.lang.OutOfMemoryError:PermGen space」エラーの処理

2
Beel

また、上記のオプションを試した後、更新されたJVMで確認してください。私はjdk1.6を使用していて、同じ問題に直面していました。 EclipseのjvmをJDK1.7に変更したとき、正常に動作しています。

1
Anand Kumar

Eclipse.iniMaxPermSizeを増やします。 RAMが快適な場合は、128Mまたは256Mに設定することをお勧めします

-vmargs -XX:PermSize=64M -XX:MaxPermSize=128M  

Perm-Gen Errors Got You Down? で報告されているように、多くの人がEclipse 3.2でPermGenの問題に直面していることにも注意してください。また、Eclipse 3.2は4年以上前のものなので、最新バージョンにアップグレードすることをお勧めします(Eclipse 3.6が現在のバージョンです)。

参照資料

1
Pascal Thivent