无法更改永久内存
Posted
技术标签:
【中文标题】无法更改永久内存【英文标题】:Unable to change permgen memory 【发布时间】:2012-05-28 21:34:14 【问题描述】:我们的 Java EE Web 应用程序中出现 PermGen Out of memory 异常:
java.lang.OutOfMemoryError: PermGen 空间
我们已经阅读了很多关于如何解决它的帖子,几乎所有帖子都说我们必须增加 PermSize(默认值和最大值)。但我们无法改变它们。 我们尝试修改 setenv.sh、catalina.sh 和 startup.sh 添加以下代码:
导出 JAVA_OPTS="-XX:PermSize=M -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
我们也尝试使用终端来做:
导出 JVM_ARGS="-XX:PermSize=256m-XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
但是当我们使用“jstat -gcpermcapacity”检查它时,没有任何变化;记忆总是一样的。 我们的环境是 Centos 6、Apache 2.2、Tomcat 5.5、Java 6,我们已经完成了我们的应用部署 在我们的帐户中安装 WHM 的 servlet。
【问题讨论】:
您可能想要使用 CATALINA_OPTS 而不是 JAVA_OPTS:CATALINA_OPTS 将用于启动和关闭(您可能不需要一个巨大的堆和额外的永久空间来发送“SHUTDOWN”到关闭端口)。此外,JVM_ARGS 不会影响任何东西。 您如何实际启动 Tomcat?使用 CentOS 脚本,还是使用 bin/startup.sh? 感谢克里斯托弗!实际上,我们的服务器通过 WHM 和 cPanel 运行 Tomcat。我们使用帐户功能来安装 servlet,当我们更改 web 应用程序中的某些内容时,我们使用 WHM 中的“重新启动 Tomcat”选项(这是一个 webhost 管理器,一个 cPanel 层)。我们找不到 Tomcat 的启动脚本!! 您必须了解 cPanel 和 webhost 管理器是如何工作的……否则,您可以设置所需的所有环境变量,并且它可能不会影响 JVM。跨度> 【参考方案1】:尝试在您的 tomcat.conf 中更改它。 实际上,请检查 ps ax | grep java 查看运行了哪些命令行来生成参数。我的生产:
26552 pts/1 Sl 0:36 /usr/lib/jvm/jre/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Xmx1024m -XX:MaxPermSize= 128m -classpath :/usr/share/tomcat6/bin/bootstrap.jar:/usr/share/tomcat6/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/ usr/share/tomcat6 -Dcatalina.home=/usr/share/tomcat6 -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/tmp/tomcat6 -Djava.util.logging.config.file=/usr/ share/tomcat6/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
这是在 tomcat6、java6、centos 5.5 上
【讨论】:
谢谢,伍迪!但是我们在 /usr/local/jakarta/tomcat/bin 和 /usr/local/jakarta/tomcat/conf 中找不到 tomcat.conf。它在哪里? 在我的系统上它位于 /usr/share/tomcat6/conf 中,但我想它可能是特定于实例的。我通过查看 /etc/init.d/tomcat6 找到了我的 我在 /etc/init.d/ 中没有任何 tomcat 引用 :-( /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/jakarta/tomcat/conf/logging.properties -Djava.util.logging。 manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/jakarta/tomcat/common/endorsed -classpath /usr/local/jakarta/tomcat/bin/bootstrap.jar -Dcatalina.base=/ usr/local/jakarta/tomcat -Dcatalina.home=/usr/local/jakarta/tomcat -Djava.io.tmpdir=/usr/local/jakarta/tomcat/temp org.apache.catalina.startup.Bootstrap -server -XX :PermSize=1024m -XX:MaxPermSize=1024m -XX:+DisableExplicitGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 开始 好的,启动你的 tomcat 服务的东西(如果已设置,init.d/tomcatx 将启动该服务)。在你运行 tomcat 的项目的进程列表中,你能看到你的 catalina.base 是什么吗?【参考方案2】:我们已经解决了这个问题! 我们的应用运行在WHM上,执行Tomcat重启的脚本没有使用startup.sh文件。在我们的例子中,重置由 "starttomcat" 执行,该文件位于 /usr/bin 中。 我们已经修改了该文件,保留了变量 my @ cmd如下:
my @cmd = (
"./jsvc",
"-user",
"$user",
"-XX:PermSize=64M",
"-XX:MaxPermSize=512m",
"-cp",
"$jars",
"-Djava.endorsed.dirs=../common/endorsed",
"-outfile",
"$logdir/catalina.out",
"-errfile",
"$logdir/catalina.err",
"-verbose",
@options,
"org.apache.catalina.startup.Bootstrap",
#"-security",
"start",
);
它运行了!
【讨论】:
以上是关于无法更改永久内存的主要内容,如果未能解决你的问题,请参考以下文章