【发布时间】:2020-09-29 20:33:05
【问题描述】:
我们正在 AWS 上运行 Java Spring Boot 应用程序。我们使用的平台是Tomcat 8.5 with Java 8 running on 64bit Amazon Linux/3.3.6。这些机器是 4GB 机器。我们使用 JVM args -XMX 和 -XMS 作为 1536m 运行这个 Java 应用程序。我们面临的问题是,由于 90% 以上的内存使用率,这些实例经常进入警告状态。现在我们正在尝试按进程计算内存使用情况。
首先,我们只是在这些机器上运行了 top 命令。这是输出的一部分。
top - 11:38:13 up 4:39, 0 users, load average: 0.90, 0.84, 0.90Tasks: 101 total, 1 running,
73 sleeping, 0 stopped, 0 zombieCpu(s): 31.8%us, 3.7%sy, 5.6%ni, 57.2%id, 0.3%wa, 0.0%hi, 1.5%si, 0.0%st
Mem: 3824468k total, 3717908k used, 106560k free, 57460k buffersSwap: 0k total, 0k used, 0k free, 300068k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2973 tomcat 20 0 5426m 2.2g 0 S 37.1 60.6 173:54.98 java
如您所见,Java 占用了 2.2GB 内存。我们将 XMX 指定为 1.5GB。虽然,我们知道通过使用 XMX,我们只是在限制堆,但我们想分析这额外的 0.7GB 的确切用途。为此,我们决定使用 NewRelic。这是关于非堆内存使用情况的图表。
我们可以看到的总内存非堆内存使用量约为 200MB。因此,有了这 200MB 和 1.5GB 的堆内存,我们预计 Java 消耗的总内存为 1.7GB。这个 1.7GB 的数字也从下面的 NewRelic 图表中得到证实:
正如我之前提到的,top 命令告诉我们 Java 占用了 2.2GB 内存。但是,我们使用 NewRelic 只能占用 1.7GB。我们如何协调这额外的 0.5GB 内存?
【问题讨论】:
标签: java spring-boot tomcat memory jvm