2016-05-03 22 views
2

Tomcat8/Spring MVC/Spring Date/Hibernateを使用してWebアプリケーションを使用すると、サーバーへの展開が少数で、Java開発環境に保存されるたびに次のエラーが発生します。誰も私がこれを回避する方法を知っていますか?私は無駄なメモリを増やすためにJVMを増やそうとしました。春はJavaの設定ファイルを使用してセットアップしていない古いweb.xmlの方法PermGenエラーTomcat8/Springデータ/展開時のHibernate

[ContainerBackgroundProcessor[StandardEngine[Catalina]]] ERROR org.springframework.web.context.ContextLoader - Context initialization failed 
 
java.lang.OutOfMemoryError: PermGen space 
 
\t at java.lang.ClassLoader.defineClass1(Native Method) 
 
\t at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
 
\t at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
 
\t at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2494) 
 
\t at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:860) 
 
\t at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1302) 
 
\t at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) 
 
\t at org.springframework.util.ConcurrentReferenceHashMap$EntrySet.iterator(ConcurrentReferenceHashMap.java:794) 
 
\t at java.util.AbstractMap$1$1.<init>(AbstractMap.java:322) 
 
\t at java.util.AbstractMap$1.iterator(AbstractMap.java:321) 
 
\t at org.springframework.beans.CachedIntrospectionResults.clearClassLoader(CachedIntrospectionResults.java:164) 
 
\t at org.springframework.context.support.AbstractApplicationContext.resetCommonCaches(AbstractApplicationContext.java:881) 
 
\t at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:563) 
 
\t at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) 
 
\t at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) 
 
\t at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 
 
\t at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4810) 
 
\t at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255) 
 
\t at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
 
\t at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3831) 
 
\t at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292) 
 
\t at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5616) 
 
\t at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377) 
 
\t at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
 
\t at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
 
\t at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349) 
 
\t at java.lang.Thread.run(Thread.java:745) 
 
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space

答えて

0

である私は、他のTomcat PermGenの問題を見てきましたので、私は最初にそれはだかどうかを確認するためにこれらの引数を使用して試してみましたPermGenのサイズを増やす前に十分です。

-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenSweepingEnabled 

これでうまくいかない場合は、ヒープサイズではなくPermGenを増やしてください。次のJVM引数を使用してPermGenサイズを設定できます。-XX:MaxPermSize=256M

0

これは、アプリケーションが完全に展開解除されないために発生します。開発環境の保存時にエラーが発生します。これは、アプリケーションの再デプロイを引き起こす可能性があるためです。

この種のエラーは実際にはデバッグが難しく、原因を見つけた場合は、使用しているライブラリに問題がある可能性があるため、問題を自分で解決できないことがあります。この種のバグを追跡する上での参考になるのは、https://plumbr.eu/blog/memory-leaks/hunting-down-memory-leaks-a-case-studyです。

私は数年前に同じ問題を抱えていましたが、これはlog4jの問題でした。最終的には簡単な方法でアプリケーションを再デプロイする代わりに、アプリケーションサーバーを再起動することができました。

実際これは、現在、多くのプロジェクトが、アプリケーションサーバーごとに1つのアプリケーションをデプロイする(またはサーバーを組み込む)ことを選択し、変更についてすべてを再起動する理由の1つです。

にもかかわらず、時間があれば、これは構成エラーである可能性があるため、これを追跡する価値があります。あなたはあなたのアプリとそれを実行するランタイムについてたくさん学ぶことができます。

0

私のClassLoader Leak Prevention libraryをアプリケーションに追加するだけで、問題を解決できたらうれしいです。これを書いている時点で、それはこのMavenの依存関係

<dependency> 
    <groupId>se.jiderhamn</groupId> 
    <artifactId>classloader-leak-prevention</artifactId> 
    <version>1.15.2</version> 
</dependency> 

プラスあなたweb.xml(まもなくリリースされるバージョン2で必要とされることはありません)でのことを意味します

<listener> 
    <listener-class>se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventor</listener-class> 
</listener> 

第三の詳細についてはこの問題が発生する可能性のあるサードパーティのライブラリを参照して、独自のコードと外部ライブラリの両方でこれをどのようにデバッグするかを学んでください。this blog series of mineを参照してください。