0

我通过在以下设置中将我的 Tomcat 实例配置为不使用超过 1GB 的 RAM setenv.sh

$ cat /opt/tomcat8.5/bin/setenv.sh 
#!/bin/sh

export JAVA_OPTS="-Djava.awt.headless=true -server -Xms48m -Xmx1024M -XX:MaxPermSize=512m"

实际上,运行的 Tomcat 实例似乎考虑到了这一点:

$ ps aux | grep -i tomcat-juli.jar | grep -v grep | awk '{print $2}'
26105
$ sudo jinfo 26105 | grep VM\ flagsNon-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=50331648 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=357564416 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=16777216 -XX:OldSize=33554432 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 

通过使用 Java VisualVM 附加到正在运行的实例,我看到了与上述兼容的图片:

在此处输入图像描述

为什么然后htop报告我的 Tomcat 消耗了我 8 GB 内存的一半?

在此处输入图像描述

4

1 回答 1

3

限制堆大小 ( -Xmx1024M) 仅限制 Java 堆的大小。JVM 可以自由使用尽可能多的“本机”内存来运行它自己。

不属于 Java 堆的东西:

  1. 永久代
  2. 线程堆栈
  3. 由 JIT 编译的本机代码

查看Java 本机内存使用情况,了解如何深入了解 Java 堆外正在使用的内存。

请注意,如果您愿意为您的 JVM 提供一个完整的 gig 或 RAM,您也可以设置-Xms== -Xmx,否则您只会浪费 CPU 周期重新调整内存大小,直到堆达到其最大大小。

于 2016-12-15T22:33:03.313 回答