如何确保 Tomcat6 在 Windows 上读取 CATALINA_OPTS?

Posted

技术标签:

【中文标题】如何确保 Tomcat6 在 Windows 上读取 CATALINA_OPTS?【英文标题】:How to make sure that Tomcat6 reads CATALINA_OPTS on Windows? 【发布时间】:2011-04-04 18:26:09 【问题描述】:

我有一个在 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。 还有什么想法吗?

干杯! 木龙

【问题讨论】:

好点:C:\Program Files\Java\jdk1.6.0_19\jre\bin\server\jvm.dll 我猜这种问题是针对serverfault.com的。 Tomcat 开发人员建议将您的自定义设置分开。使用“%CATALINA_BASE%\bin\setenv.bat”文件设置变量,而不是在“catalina.bat”中修改它们。 【参考方案1】:

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

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

到tomcat6w.exe上的java选项。

谢谢!

【讨论】:

【参考方案2】:

实际操作方法(在 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 嵌套)。我个人将这一行作为这批的第一条语句

【讨论】:

Tomcat 开发人员建议将您的自定义设置分开。使用“%CATALINA_BASE%\bin\setenv.bat”文件设置变量,而不是在“catalina.bat”中修改它们。【参考方案3】:

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

JAVA_OPTS=-Djvmarg='-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m'

【讨论】:

【参考方案4】:

看看你在哪里设置它,使用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 没有捡起它。

【讨论】:

以上是关于如何确保 Tomcat6 在 Windows 上读取 CATALINA_OPTS?的主要内容,如果未能解决你的问题,请参考以下文章

如何在MyEclipse中配置Tomcat6.0

tomcat6.exe是啥 是病毒吗

如何确保在 windows 和 linux 上具有相同的浮点行为?

如何在 apache2 tomcat6 中安装 ffmpeg 或在 ubuntu 中安装 xampp?

如何使用 Tomcat6 管理 Tomcat 发布/部署以减少停机时间

如何在Windows和Linux上确保相同的浮点行为?