根据
top
命令,Java/Tomcat 进程使用了 77.9% 的可用内存(32GB 物理 * 77.9% = 25.32GB):
虚拟:32.5 GB 分辨率:24.5 GB SHR:24.9 MB
JVM
-Xmx
选项已为此应用程序设置为允许 JVM 12GB,这似乎受到尊重。
但是,随着盒子上的内存使用量慢慢增加到物理极限,我们的监控工具不断发出警报,然后我们必须重新启动 Tomcat 才能将其恢复。
12 GB 的 JVM 最大值也反映在 JProfiler 提供的蓝/绿堆图中。 JProfiler 提供的另一个图表显示分配了 280.7 MB 的非堆内存。
JProfiler 中的任何检测似乎都无法帮助解释 12 GB JVM 最大值与
top
报告的 25 GB 或更多之间的差距。
JProfiler 始终显示堆内存使用量在 4 GB 和 7 GB 之间徘徊。
我正在考虑使用 Linux 原生内存分析器 (Valgrind) 进行分析,看看是否可以揭示更多信息,但 JProfiler 中是否有任何其他功能可以帮助解释差距?
我已经使用了 JProfiler 工具:
Heap Walker
、Live Memory
和分配记录器,但应用程序的内存使用情况似乎很健康且不起眼。
这绝对是一个强大的工具,这让我想知道我在这里错过了什么。
我尝试过的其他事情包括查看
proc/PID/maps | wc -l
的相同过程 - 在 max_map_count
的 65,530
中,该过程正在使用 845
。这似乎表明即使可能涉及内存映射文件,数量也远低于最大值。我只是不确定如何确定可能占用了多少内存空间。
我也比较了
top
和atop
是一致的
我还针对该进程运行了 pmap,但不确定如何解释它产生的大量文本转储。出于这个原因,我希望 Valgrind 更加人性化。