java.lang.OutOfMemoryError:PermGen space Exception

我得到这个java.lang.OutOfMemoryError: PermGen spaceexception。 我正在使用Eclipse Juno和Tomcat 7.0。 此exception在控制台中每10-15分钟至少发生一次。 怎么解决?

 Feb 25, 2016 10:23:23 AM org.springframework.beans.factory.support.DefaultListableBeanFactory destroyBean SEVERE: Destroy method on bean with name 'mvcUrlPathHelper' threw an exception java.lang.OutOfMemoryError: PermGen space at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2895) at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1173) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1681) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2895) at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1173) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1681) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessBeforeDestruction(PersistenceAnnotationBeanPostProcessor.java:375) at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:242) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554) at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:925) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523) at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:932) at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:997) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:547) Feb 25, 2016 10:23:24 AM org.springframework.beans.factory.support.DefaultListableBeanFactory destroyBean SEVERE: Destroy method on bean with name 'mvcPathMatcher' threw an exception java.lang.OutOfMemoryError: PermGen space Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space 

什么是java.lang.OutOfMemoryError:PermGen空间?

答:

java.lang.OutOfMemoryError: PermGen space消息指示内存中的Permanent Generation区域已耗尽。

允许任何Java应用程序使用有限的内存。 在应用程序启动期间指定特定应用程序可以使用的确切内存量。

Java内存分为不同的区域,可以在下图中看到: 在此处输入图像描述

这个错误PermGen空间的解决方案是什么?

答:

对于堆,

 export JVM_ARGS="-Xms1024m -Xmx1024m" 

对于Permgen,

 JVM_ARGS="-XX:PermSize=512M -XX:MaxPermSize=512m" 

您还可以提供其他部分

 -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC XX:+CMSClassUnloadingEnabled 

您还可以提供更多额外的部分:)

 -XX:PermSize=512m -XX:MaxPermSize=512m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -XX:SurvivorRatio=2 -XX:MaxTenuringThreshold=128 -XX:TargetSurvivorRatio=90 -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10 -XX:+UseTLAB -XX:+CMSParallelRemarkEnabled -XX:+CMSClassUnloadingEnabled 

Metaspace:一个新的记忆空间诞生了

JDK 8 HotSpot JVM现在使用本机内存来表示类元数据,称为Metaspace ; 类似于Oracle JRockit和IBM JVM's

好消息是它不再意味着java.lang.OutOfMemoryError: PermGen space问题,你不再需要调整和监视这个内存空间了。

相关链接:

  1. https://plumbr.eu/outofmemoryerror/java-heap-space
  2. https://plumbr.eu/outofmemoryerror/permgen-space
  3. http://stas-blogspot.blogspot.in/2011/07/most-complete-list-of-xx-options-for.html#UseConcMarkSweepGC
  4. https://www.javacodegeeks.com/2013/12/decoding-java-lang-outofmemoryerror-permgen-space.html
  5. http://www.javavillage.in/reasons-outofmemory-permespace.php
  6. 处理“java.lang.OutOfMemoryError:PermGen space”错误

Java 8链接

  1. 在Java 8中使用MetaSpace有什么用?
  2. https://blogs.oracle.com/poonam/entry/about_g1_garbage_collector_permanent
  3. https://plumbr.eu/outofmemoryerror/metaspace
  4. https://dzone.com/articles/java-8-permgen-metaspace

为更多PermGenSpace配置Java很容易,但我建议迁移到Java 1.8运行时。 安装Java 8 SDK并添加两行

 -vm D:/jdk8/jre/bin/javaw.exe 

到eclipse.ini。 此问题从Java 1.8开始修复,不再需要任何黑客攻击。

当你得到java.lang.OutOfMemoryError: PermGen space errors ,你需要增加Eclipse可用的永久生成空间。要这样做,请修改Eclipse的eclipse.ini文件。 设置如下

 -XX:MaxPermSize=1024m 

如需更多帮助,请参阅以下链接,

java.lang.OutOfMemoryError:PermGen空间

而是在eclipse.ini中进行更改,最好安装Java 8 。

我安装了Java 8,现在我没有得到java.lang.OutOfMemoryError: PermGen space Exception。