6

我有一个在 Windows2003 机器上运行的 Tomcat6。我在这台服务器上部署了 2 个 Grails 应用程序,我很快注意到在部署后的某个时间一切都崩溃了,并出现了一个经典的 PermGen 错误。

java.lang.OutOfMemoryError: PermGen space
 java.lang.ClassLoader.defineClass1(Native Method)
 java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
 java.lang.ClassLoader.defineClass(ClassLoader.java:616)
 org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.de 
...

所以我找到了解决这个问题的一个常见方法:增加堆和永久空间:

set CATALINA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m"

添加到 C:\apache-tomcat-6.0.26\bin\catalina.bat。不幸的是,这没有用,但问题是我不确定 Tomcat 是否正在接受它。我检查了各种日志,但这些选项从未打印出来。有没有办法记录它们并确保 Tomcat 已阅读它们?

编辑:我尝试使用 tomcat6w.exe 添加以下 JVM 选项:

-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled 
-XX:+UseConcMarkSweepGC

什么都没有改变。正常运行 2-3 分钟后,我得到一个 permGen。还有什么想法吗?

干杯! 穆龙

4

4 回答 4

6

谢谢你们!我终于通过添加解决了这个问题:

-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
-XX:+UseConcMarkSweepGC
-XX:PermSize=128m
-XX:MaxPermSize=512m 

到tomcat6w.exe 上的java 选项。

谢谢!

于 2010-08-30T12:58:55.090 回答
4

实际的做法(在 Catalina.bat 中),

set "JAVA_OPTS=-Djava.awt.headless=true -server -Xms512m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"

将此行添加到这样的位置,以便将此 JAVA_OPTS 传输到文件末尾的任何 _EXECJAVA 命令(if-else 嵌套)。我个人将这一行作为这批的第一条语句

于 2014-02-17T04:59:22.557 回答
1

在启动服务器之前,我实际上将它们设置为我的 JVM 的 JAVA_OPTS

JAVA_OPTS=-Djvmarg='-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m'
于 2010-08-27T15:57:22.830 回答
0

看看你在哪里设置它,echo [statements]用来解决问题,在它传递给 VM 之前尝试设置它,比如:

set CATALINA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m"
_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% 
-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" 
-Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" 
-Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

确保您有权利不确定您拥有EXEC_JAVA哪个版本的.bat文件,但可能有几个if语句。

还要确保这些是您的 VM 的有效参数。

你可以在你的java代码中检查你的最大堆大小,使用:

long heapMaxSize = Runtime.getRuntime().maxMemory();

只需将其打印出来,如果根据您的设置正确,则内存泄漏严重,如果不正确,则tomcat不会捡起它。

于 2010-08-27T11:50:58.330 回答