为什么 JProfiler 和 Linux top 命令对同一个 Java/Tomcat 进程显示不同的非堆分配?

问题描述 投票:0回答:0

根据

top
命令,Java/Tomcat 进程使用了 77.9% 的可用内存(32GB 物理 * 77.9% = 25.32GB):

enter image description here

虚拟:32.5 GB 分辨率:24.5 GB SHR:24.9 MB

JVM

-Xmx
选项已为此应用程序设置为允许 JVM 12GB,这似乎受到尊重。

但是,随着盒子上的内存使用量慢慢增加到物理极限,我们的监控工具不断发出警报,然后我们必须重新启动 Tomcat 才能将其恢复。

12 GB 的 JVM 最大值也反映在 JProfiler 提供的蓝/绿堆图中。 JProfiler 提供的另一个图表显示分配了 280.7 MB 的非堆内存。

enter image description here

enter image description here

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 更加人性化。

java tomcat memory-management memory-leaks jprofiler
© www.soinside.com 2019 - 2024. All rights reserved.