java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError:PermGen空间
每个人 我在运行服务器时遇到异常,我认为是内存泄漏 我尝试了参数JAVA_OPS的许多值,但仍然得到异常 在控制台中,我得到了这个异常,您可以看到如下java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError:PermGen空间,java,tomcat,memory-leaks,out-of-memory,Java,Tomcat,Memory Leaks,Out Of Memory,每个人 我在运行服务器时遇到异常,我认为是内存泄漏 我尝试了参数JAVA_OPS的许多值,但仍然得到异常 在控制台中,我得到了这个异常,您可以看到如下 Nov 18, 2013 2:48:48 PM org.apache.catalina.startup.HostConfig deployDescriptors SEVERE: Error waiting for multi-thread deployment of context descriptors to complete java.uti
Nov 18, 2013 2:48:48 PM org.apache.catalina.startup.HostConfig deployDescriptors
SEVERE: Error waiting for multi-thread deployment of context descriptors to complete
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:578)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1401)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:317)
at
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1140)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.OutOfMemoryError: PermGen space
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
我发现另一个Java应用服务器GlassFish也会出现这种情况。通常,我们必须重新启动应用服务器以释放应用服务器使用的所有内存和资源。大多数Java应用程序服务器,如GlassFish和Tomcat,可能非常需要内存。您可能希望在catalina.sh文件(或其他catalina配置文件)中添加以下行以更改JVM参数,这可能会增加内存分配:
export CATALINA_OPTS="-Xms512M -Xmx1024M"
指定您已经尝试过的“许多值”总是有意义的 首先:它们必须是
JAVA\u OPTS
,但在这个问题上也可能是打字错误。但是,使用CATALINA\u选项更好
最重要的是,当出现PermGen错误时,
-Xmx
根本没有帮助。您需要设置-XX:MaxPermSize=256m
(或其他内存量)。当你在谷歌上搜索错误消息时,你会发现很多关于这个问题的信息——PermGen是Sun/Oracle JVM使用的一个特定的内存区域。增加可用堆内存根本没有帮助。在不分析原因的情况下增加内存有什么意义。我建议尝试使用一些分析工具(JProfiler,YourToolkKit)来抓住问题人
一旦您对导致问题的原因有所了解,您就可以着手解决它(例如:打开的连接、未关闭的流等)
祝你好运。在linux中,创建一个setenv.sh文件,并将该文件保存在
tomcat/bin
文件夹中。
在文件中添加下面的行并保存它
export CATALINA_OPTS=“$CATALINA_OPTS-server-Xms256m-Xmx1024m
-XX:PermSize=512m-XX:MaxPermSize=512m”
现在重新启动tomcat,您可以开始了 您必须在tomcat服务器VM参数中设置XX:MaxPermSize,如下所示: 根据本地系统上的内存,您可以修改: 双击服务器转到 开放式发射配置 在vm参数中 放这条线 -XX:MaxPermSize=2048m
现在在linux中重新启动tomcat,将以下行添加到路径\u to \u tomcat/bin中的
catalina.sh
CLASSPATH=
if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
. "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
. "$CATALINA_HOME/bin/setenv.sh"
fi
之后,您应该创建setenv.sh
(如果bin中不存在)
如果您处于路径\u至\u tomcat/bin
vi./setenv.sh
并添加以下行
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m"
现在重新启动tomcat您的问题已经解决了…可能是tomcat的问题。当涉及到类装入器时,它以泄漏而闻名……当它发生时,你在做什么?简单地增加内存和一些更多的内存并不能解决问题,只能延迟。