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)
セカンダリ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行を作成します。したがって、既存のワークスペースで作業している場合は、デバッグまたは実行構成を変更します。より良い未来。
プロジェクトは多くのメモリを消費します。 Eclipseで使用するメモリを増やします。編集Eclipse.ini
以下の行を変更または追加します-vmargs
。
-Xms256m -Xmx512m -XX:MaxPermSize = 512m
少なくとも2GBのRAMがあると仮定します。
以下の画像を参照してください。
Javaアプリケーションは、限られた量のメモリしか使用できません。特定のアプリケーションが使用できるメモリの正確な量は、アプリケーションの起動時に指定されます。物事をより複雑にするために、Javaメモリは異なる領域に分離されており、その1つはPermGenと呼ばれています。
これらすべての領域のサイズは、JVMの起動時に設定されます。サイズを明示的に設定しない場合、プラットフォーム固有のデフォルトが使用されます。
だから-Java.lang.OutOfMemoryError: PermGen space
メッセージは、メモリ内の永続サイズ領域が使い果たされているであることを示します。
PemGenと呼ばれるこの特定の領域は、Javaクラスがロードおよび保存される専用の領域です。これは、次のもので構成されます。
それはほとんどそれです。もう少し細かく分割しますが、実際のメモリ消費に数パーセント以上は影響しません。これらはすべてパーマネント世代に割り当てられ、パーマネント世代にとどまります。
ご覧のとおり、永続的な世代サイズの要件は、ロードされるクラスの数とそのようなクラス宣言のサイズの両方に依存します。そのため、このようなエラーの主な原因は簡単にわかります。クラスが多すぎるか、永続クラスにロードされるクラスが大きすぎる。
症状の迅速な修正は簡単です-ヒープ内のPermGen領域を使い果たした場合、そのサイズを増やす必要があります。このソリューションは、JVMに十分なエルボルームを与えていない場合に役立ちます。そのため、アプリケーションの起動構成を変更し、以下を追加(または存在する場合は増加)します。
-XX:MaxPermSize=512m
これは、デバッグセッションなどでEclipse内でTomcatを実行する場合にかなり頻繁に発生します。メモリからは、Sun JVMの問題です。アニーウェイ、簡単な修正があります:
Eclipse.iniの-vmargsの下に以下を追加します(Eclipseバイナリと同じディレクトリにあります)。
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
これにより、Eclipseの実行中に積極的なガベージコレクションが可能になり、Eclipseで単にRAMを追加するよりも洗練されたソリューションになります。
お役に立てれば!
上記の答えはおそらくあなたのためにそれを解決しますが、とにかくいくつかの興味深い関連リンクがあります:
このエラーに関する多くの議論と提案を含む記事を次に示します。 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」エラーの処理
また、上記のオプションを試した後、更新されたJVMで確認してください。私はjdk1.6を使用していて、同じ問題に直面していました。 EclipseのjvmをJDK1.7に変更したとき、正常に動作しています。
Eclipse.ini
でMaxPermSize
を増やします。 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が現在のバージョンです)。