java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError:PermGen space

时间:2013-11-18 11:54:48

标签: 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.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

6 个答案:

答案 0 :(得分:3)

指定您已经尝试过的“多个值”总是有意义的。

首先:他们需要JAVA_OPTS,但这也可能是这个问题中的错字。但是,使用CATALINA_OPTS甚至更好。

最重要的是,当存在PermGen错误时,-Xmx根本没有帮助。您想要设置-XX:MaxPermSize=256m(或其他一些内存量)。您只需查看错误消息即可找到有关此问题的大量信息 - PermGen是Sun / Oracle JVM使用的特定内存区域。增加可用的堆内存根本没有帮助。

答案 1 :(得分:2)

我发现这也发生在另一个Java Application Server GlassFish上。通常,我们必须重新启动Application Server以释放Application Server使用的所有内存和资源。大多数Java应用程序服务器,如GlassFish和Tomcat,都可能非常耗费内存。您可能希望将以下行添加到catalina.sh文件(或其他catalina配置文件)中以更改JVM参数,这可能会增加内存分配:

export CATALINA_OPTS="-Xms512M -Xmx1024M"

答案 2 :(得分:2)

通过分析原因来增加记忆力的重点是什么。我建议尝试使用一些分析工具(JProfiler,YourToolkKit)来捕捉问题。

一旦你对导致问题的原因有所了解,你就可以努力(例如:开放连接,未封闭的流等)

祝你好运。

答案 3 :(得分:2)

在Linux中,将以下行添加到位于path_to_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中不存在) 如果您位于path_to_tomcat / bin

  

vi ./setenv.sh

并添加跟随线

export JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m"

现在重新启动tomcat,您的问题已经结束...

答案 4 :(得分:0)

在linux中,创建一个setenv.sh文件并将文件保存在tomcat/bin文件夹中。 在文件中添加以下行并保存。

  

export CATALINA_OPTS =" $ CATALINA_OPTS -server -Xms256m -Xmx1024m   -XX:PermSize = 512m -XX:MaxPermSize = 512m"

现在重启tomcat,你可以去.. !!

答案 5 :(得分:0)

您必须在tomcat服务器VM参数中设置XX:MaxPermSize,如下所示:

根据您在本地系统上的内存,您可以修改:

双击服务器转到 打开启动配置

在vm参数中 把这一行

-XX:MaxPermSize参数=2048米

现在重启tomcat