如何确保 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何确保在 windows 和 linux 上具有相同的浮点行为?
如何在 apache2 tomcat6 中安装 ffmpeg 或在 ubuntu 中安装 xampp?