54

我在 Windows 环境中工作,每次使用 tomcat 时都会收到此错误-

Apr 30, 2012 5:30:37 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: PermGen space
2012-04-30 17:30:37.719 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for sun.nio.ch.SelectionKeyImpl@4ae53a99
2012-04-30 17:30:37.719 INFO net.spy.memcached.MemcachedConnection:  Reconnecting due to failure to connect to {QA sa=localhost/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0}
java.net.ConnectException: Connection refused: no further information
Apr 30, 2012 5:30:37 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: PermGen space
Exception in thread "Memcached IO over {MemcachedConnection to localhost/127.0.0.1:11211}" java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:41 PM org.apache.catalina.connector.CoyoteAdapter service
SEVERE: An exception or error occurred in the container during the request processing
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:43 PM org.apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Throwable, location=/error.action]
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:42 PM org.apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Throwable, location=/error.action]
java.lang.OutOfMemoryError: PermGen space
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space

我尝试添加JAVA_OPTS with the value as -Xms1024m -Xmx1024m系统变量,但我仍然一次又一次地遇到相同的错误(java.lang.OutOfMemoryError:PermGen 空间) 。

任何帮助将不胜感激。我也阅读了 Stack Overflow 上的其他帖子,但没有成功。

4

11 回答 11

107

PermGen 空间是 Tomcat 用来存储类定义(只有定义,没有实例化)和已被实习的字符串池的地方。从经验来看,PermGen 空间问题往往在开发环境中经常发生,因为 Tomcat 必须在每次部署 WAR 或执行 jspc(编辑 jsp 文件时)时加载新类。就个人而言,我在进行开发测试时倾向于部署和重新部署战争,所以我知道我迟早会用完(主要是因为 Java 的 GC 周期仍然有点垃圾,所以如果你快速频繁地重新部署你的战争够了,空间填满的速度比他们能管理的要快)。

从理论上讲,这在生产环境中应该不是问题,因为您(希望)不要在 10 分钟的基础上更改代码库。如果它仍然发生,那只是意味着您的代码库(和相应的库依赖项)对于默认内存分配来说太大了,您只需要弄乱堆栈和堆分配。我认为标准是这样的:

-XX:MaxPermSize=SIZE

然而,我发现最好的解决方法是让类被卸载,这样你的 PermGen 就永远不会用完:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

过去,类似的东西对我来说很神奇。有一件事,在使用这些时有一个显着的性能权衡,因为 permgen 扫描会为你提出的每个请求或类似的东西发出额外的 2 个请求。您需要在使用与权衡之间取得平衡。

于 2012-05-01T01:06:49.160 回答
17

您必须为 tomcat JVM 的 PermGenSpace 分配更多空间。

这可以通过 JVM 参数来完成:-XX:MaxPermSize=128m

默认情况下,PermGen 空间是 64M(它包含所有编译的类,所以如果你的类路径中有很多 jar(类),你可能确实会填满这个空间)。

附带说明一下,您可以使用JVisualVM监控 PermGen 空间的大小,甚至可以使用YourKit Java Profiler检查其内容

于 2012-05-01T00:57:52.353 回答
10

为了补充迈克尔的答案,并根据这个答案,处理该问题的一种安全方法是使用以下论点:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC
于 2013-10-29T10:10:38.843 回答
5

如果 tomcat 作为 Windows 服务运行,CATALINA_OPTS 和 JAVA_OPTS 似乎都没有任何效果。

您需要在 GUI 的 Java 选项中进行设置。

下面的链接很好地解释了它

http://www.12robots.com/index.cfm/2010/10/8/Giving-more-memory-to-the-Tomcat-Service-in-Windows

于 2014-09-26T08:19:15.297 回答
3

在 Tomcat 7.0 Windows Service Installer Version.There 没有 catalina.bat 在 /bin 。所以你需要在 /bin 中打开 Tomcat7w.exe 并添加打击 JVM 参数

-XX:PermSize=256m -XX:MaxPermSize=512m

在 Java 选项卡中的 Java 选项上,像这样。您还可以添加其他选项。

在此处输入图像描述

另一个,如果你使用 IntellijIDEA,你需要在服务器配置中添加 JVM 参数,像这样。

在此处输入图像描述

于 2015-12-18T07:44:15.673 回答
2

这对我有用,如果valuestartup.bat不存在,则需要在以下行中添加。完整的线路:set JAVA_OPTS-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256

set JAVA_OPTS=-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256
于 2015-06-29T14:02:30.650 回答
2

@AndreSmiley 的行代码对我有用。

唯一需要修改的是。

-XX:MaxPermSize=256

“m”表示 MB。

实际上,我的应用程序有点庞大,因此建议我将其设置为 1024m 以提高性能。

于 2015-10-15T22:51:14.733 回答
1

如果您将 eclipse 与 tomcat 一起使用,请按照以下步骤操作

  1. 在服务器窗口上双击 tomcat,它会打开 tomcat 的概览窗口。

  2. 在概述窗口中,您将在常规信息下找到打开启动配置,然后单击打开启动配置

  3. 在编辑配置窗口中查找参数并单击它。
  4. 在 arguments 标记中查找VM arguments
  5. 只需将此 -Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512m粘贴到参数的末尾即可。

编辑启动配置属性

于 2016-02-04T06:29:34.693 回答
1

我在 CentOS 6.6 上运行 tomcat7。我尝试创建一个新的 /usr/share/tomcat/bin/setenv.sh 文件并同时设置JAVA_OPTSCATALINA_OPTS. 但是tomcat不会在重新启动时获取值。当我将以下行放入 /etc/tomcat/tomcat.conf 时:

CATALINA_OPTS="-Xms128m -Xmx1024m -XX:MaxPermSize=1024m"

tomcat 确实选择了新的环境变量。我通过运行验证了这一点

ps辅助| grep tomcat

并在输出中看到新设置。这花了很长时间来诊断,我没有看到其他人提出这个建议,所以我想我会把它扔给互联网社区。

于 2016-02-05T09:31:22.617 回答
0

我在 Intellij Ideav11 上尝试了同样的方法。

使用 grep 检查过程后,它没有选择设置。如果没有,请改为在 catalina.sh 中提供 JAVA_OPTS 的内存设置。

于 2018-03-08T19:52:07.753 回答
-5

终止 tomcat 进程(对于 Linux,强制终止 -9)并再次启动它可以解决问题。我的猜测是,tomcat 实例没有被shutdown.bat 正确杀死。所以,我们需要强行终止进程并重新开始。

于 2014-05-02T19:26:42.313 回答