我购买了一台具有 1GB 内存的虚拟服务器来运行 Java 网站应用程序。我已经安装了 Tomcat 6.0.33。每次运行 tomcat 时,它都会占用大约 450 MB 的内存。
我尝试了各种方法来减少这种情况,我将 CATALINA_OPS 设置为
export CATALINA_OPTS="-Xms256m -Xmx256m"
我已经创建了 setenv.sh 文件并将以下内容输入其中:
JAVA_HOME="/usr/local/java"
export JAVA_HOME
JAVA_OPTS="-Xmx256m -Xms256m"
export JAVA_OPTS
CATALINA_HOME="/usr/local/tomcat"
export CATALINA_HOME
当我传递此命令时: ps -ef | grep tomcat 我有:
root 3150 1 5 15:32 pts/0 00:00:18 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Xmx256m -Xms256m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms256m -Xmx256m -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 3217 2041 0 15:37 pts/0 00:00:00 grep tomcat
这表明我的参数确实被使用了。
有没有什么方法可以减少 tomcat 消耗的内存?谢谢。
答案1
这里的问题其实不是 Tomcat,而是 Java。Java 在许多不同的地方使用内存。Java 运行时使用它自己的内存,这将包含在您的数字中,此外,Java 将内存分为四个不同的位置:
堆:
-Xms
这是用于存储对象的内存,由和参数控制-Xmx
。堆栈:这是用于存储程序维护的线程的堆栈帧的内存,可以通过参数进行控制
-Xss
。永久代内存:这是用于存储已编译类和池化字符串以及其他一些内容的内存,通常可以使用来控制,
-XX:MaxPermSize
尽管-XX
代表调试参数,因此不能保证它在所有 JVM 上都存在。但是,默认的 Sun/Oracle 参考实现始终都有它们。JNI 分配的内存任何使用本机方法和 JNI 的类都可能分配无限内存。这些内存来自操作系统而不是堆,如果不访问源代码,就无法知道本机类将使用多少内存。
Java 内存模型的概述可能超出了这个问题的答案范围,我在网上找不到好的简明文章/描述,但对你的问题的简短回答是,如果你想限制 Java 程序使用的绝对内存量,没有简单的方法可以做到这一点。启发式地,可能将你的-Xms
和-Xmx
参数削减到 128m,你应该会接近,但这实际上取决于你的应用程序。