java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space 意思是:Java并发执行异常:Java内存溢出错误:PermGen空间。

4

大家好

当我运行服务器时,我遇到了异常,我认为这是内存泄漏!

我尝试了许多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

这很可能是Tomcat的问题。它因涉及类加载器而泄漏而声名狼藉... - Adam Arold
什么时候发生,你在做什么?仅仅添加内存和更多的内存并不能解决问题,只是在拖延。 - M. Deinum
6个回答

5

在指定你已经尝试过的“多个值”时,这总是有意义的。

首先:它们需要是JAVA_OPTS,但这可能只是本问题中的一个笔误。然而,最好使用CATALINA_OPTS

最重要的是,当出现PermGen错误时,-Xmx根本没有帮助。你需要设置-XX:MaxPermSize=256m(或其他一些内存量)。当你谷歌错误信息时,你会发现很多关于这个问题的信息——PermGen是Sun/Oracle JVM使用的特定内存区域。增加可用堆内存根本没有帮助。


3

我发现另一个Java应用服务器GlassFish也会出现这种情况。通常,我们需要重新启动应用服务器来释放应用服务器使用的所有内存和资源。大多数Java应用服务器(如GlassFish和Tomcat)都可能很占用内存。你可以在catalina.sh文件(或其他catalina配置文件)中添加以下行来更改JVM参数,并增加内存分配:

export CATALINA_OPTS="-Xms512M -Xmx1024M"

2
增加内存而不分析原因有何意义呢?我建议使用一些分析工具(如JProfiler、YourToolkKit)来捕获问题。一旦您对导致问题的原因有了一些想法,就可以着手解决它(例如:打开连接、未关闭流等)。祝好运。

2
在Linux中,打开路径为path_to_tomcat/bin的catalina.sh文件,在其中添加以下几行代码。"Original Answer"翻译成"最初的回答"。
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

在此之后,如果你在 path_to_tomcat/bin 目录下,需要创建 setenv.sh 文件(如果不存在)。

vi ./setenv.sh

然后添加以下内容:
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m"

现在重新启动Tomcat,你的问题就解决了... 最初的回答。

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

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

现在重新启动 Tomcat,一切都准备就绪..!!

0

您需要在Tomcat服务器VM参数中设置XX:MaxPermSize,如下所示:

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

双击服务器进入启动配置

在VM参数中 输入以下内容

-XX:MaxPermSize=2048m

现在重新启动Tomcat


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接