java.lang.OutOfMemoryError: PermGen 空间异常

Posted

技术标签:

【中文标题】java.lang.OutOfMemoryError: PermGen 空间异常【英文标题】:java.lang.OutOfMemoryError: PermGen space Exception 【发布时间】:2016-06-07 17:31:36 【问题描述】:

我得到了这个java.lang.OutOfMemoryError: PermGen space 异常。我正在使用 Eclipse Juno 和 Tomcat 7.0。此异常在控制台中每 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

【问题讨论】:

bean 'mvcUrlPathHelper'的destroy方法写的是什么? 你在 Tomcat 中为 jvm 定义的大小是多少?? @PhanindraGopishetty mvcUrlPathHelper?? @VikrantKashyap 我在哪里可以检查 jvm 大小?? 好的。因此,您必须尝试使用​​如此少量的可用内存来加载大量数据。您将不得不进行一些优化。使用休眠查询一次获取几条记录,而不是一次获取全部数据。示例 - query.setFirstResult(0); query.setMaxResults(10); 【参考方案1】:

什么是 java.lang.OutOfMemoryError: PermGen space?

回答:

java.lang.OutOfMemoryError: PermGen space 消息表示永久代在内存中的区域已用完。

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

Java 内存被分成不同的区域,如下图所示:

这个错误永久代空间的解决方案是什么?

回答:

对于堆,

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 

元空间:一个新的内存空间诞生

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

好消息是这意味着不再有java.lang.OutOfMemoryError: PermGen space 问题,并且您不再需要调整和监控此内存空间。

相关链接:

    https://plumbr.eu/outofmemoryerror/java-heap-space https://plumbr.eu/outofmemoryerror/permgen-space http://stas-blogspot.blogspot.in/2011/07/most-complete-list-of-xx-options-for.html#UseConcMarkSweepGC https://www.javacodegeeks.com/2013/12/decoding-java-lang-outofmemoryerror-permgen-space.html http://www.javavillage.in/reasons-outofmemory-permespace.php Dealing with "java.lang.OutOfMemoryError: PermGen space" error

Java 8 链接

    What is the use of MetaSpace in Java 8? https://blogs.oracle.com/poonam/entry/about_g1_garbage_collector_permanent https://plumbr.eu/outofmemoryerror/metaspace https://dzone.com/articles/java-8-permgen-metaspace

【讨论】:

【参考方案2】:

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

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

到 eclipse.ini。此问题已从 Java 1.8 开始修复,不再需要任何 hack。

【讨论】:

【参考方案3】:

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

-XX:MaxPermSize=1024m

如需更多帮助,您可以参考以下链接,

java.lang.OutOfMemoryError: PermGen space

【讨论】:

尝试通过添加下面的VM参数来启用扫描,-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 或者做一件事,你正在使用Tomact,进入bin文件夹内的Tomcat安装目录打开catalina.bat并添加如下的JAVA_OPTS,设置JAVA_OPTS="-Xms1024m -Xmx10246m -XX:NewSize= 256m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m" 然后重启服务器。 tomcat目录下没有catalina.bat文件 从开始 > 所有程序 > Apache Tomcat > Tomcat 配置进入 Tomcat 配置工具。单击配置并选择 Java 选项卡。在 Java 选项卡内设置 Java 选项中的 VM 参数【参考方案4】:

与其在 eclipse.ini 中进行更改,不如安装 Java 8。

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

【讨论】:

以上是关于java.lang.OutOfMemoryError: PermGen 空间异常的主要内容,如果未能解决你的问题,请参考以下文章