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

发布于 2024-09-15 22:54:43 字数 914 浏览 4 评论 0原文

我有一个在 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 分钟后我会获得永久代。 还有其他想法吗?

干杯! 穆隆

I have a Tomcat6 running on a Windows2003 machine.
I deployed 2 Grails apps on this server and I soon noticed that everything was crashing sometime after the deploy with a classic PermGen error.

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 
...

So I found a common fix for this problem: increasing heap and permgen space with:

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

Added into C:\apache-tomcat-6.0.26\bin\catalina.bat.
Unfortunately this didn't work, but the problem is that I'm not sure that Tomcat is picking it up. I checked various logs but these options are never printed out.
Is there a way to log them and make sure that Tomcat has read them?

EDIT: I tried to add the following JVM options with tomcat6w.exe:

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

And nothing changed. I get a permGen after 2-3 minutes of uptime.
Any other idea?

Cheers!
Mulone

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

≈。彩虹 2024-09-22 22:54:43

谢谢大家!
我最终通过添加以下内容解决了该问题:

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

到 tomcat6w.exe 上的 java 选项。

谢谢!

Thank you all!
I finally solved the issue by adding:

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

To the java options on tomcat6w.exe.

Thanks!

撞了怀 2024-09-22 22:54:43

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

Actual way to do it (in Catalina.bat),

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

add this line in such a position so that this JAVA_OPTS is transferred to any of _EXECJAVA command at the end of file (if-else nested). I personally write this line as first statement of this batch

空袭的梦i 2024-09-22 22:54:43

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

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

I actually set those as JAVA_OPTS for my JVM before starting the server

JAVA_OPTS=-Djvmarg='-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m'
多情癖 2024-09-22 22:54:43

查看您在哪里设置它,使用 echo [statements] 进行故障排除,尝试在传递到虚拟机之前对其进行设置,例如:

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 语句。

还要确保这些参数对于您的虚拟机来说是有效的。

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

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

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

Look where you are setting it, use echo [statements] to troubleshoot, try setting it right before its passed to the VM, something like:

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%

Make sure you have the right EXEC_JAVA not sure which version of the .bat file you have, but probably several if statements.

Also make sure these are valid arguments for your VM.

You can check your max heap size within your java code, use:

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

Just print it out, if its correct based on your settings, you have a bad memory leak, if its not, then tomcat is not picking it up.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文