使用jmap命令查找当前堆大小

12
我想知道使用jmap命令检查Java进程的堆大小,输出格式如下所示:jmap -heap <pid>。其中包含了堆配置和堆使用情况两部分信息。堆配置包括最小和最大堆空闲比率、最大堆大小、新生代大小、Eden空间大小、老年代大小等。堆使用情况包括了新生代和老年代的使用情况,其中新生代包括了Eden、From、To三个区域的容量、使用量和空闲量,而老年代则只有总容量和使用量。容量 = 57671680 (55.0MB) 已用 = 41699008 (39.76727294921875MB) 空闲 = 15972672 (15.23272705078125MB) 使用率为72.30413263494319%
我可以使用公式来计算这些值以找出总内存使用情况吗?
欢迎提供其他在Linux上查找此信息的建议,但首选jmap。
谢谢
2个回答

3

如果您试图将其与像jconsolejvisualvm这样的显示“总堆使用情况”的主窗口进行比较,我发现通过添加“已用伊甸园空间”和“已用ps老年代空间”,我得到了等同于上述程序中该图表显示的内容--这是我现在倾向于采用的方法。


2

Heap Usage: 下的条目列出了JVM中各个分区内存池,以及它们的最大大小、已使用和空闲空间。您可以将各种 used: 值相加,这应该给出总内存使用量的合理值,尽管在列出的池中可能有一些未计算的JVM开销。


运行jmap -heap:format=b <pid>命令,并使用Eclipse的内存分析工具解析堆转储文件,可以得到总使用量为22Mb。我找不到获取相同总值的方法... - fmoga
@MelmanRo:我猜测Eclipse工具从计算中删除了所有不可达(即将被垃圾回收)的对象,这是在运行完整GC扫描时堆大小为多少的计算。我坚持认为当前实际操作系统内存使用量是我所描述的各个池的总和。 - skaffman
这可能是造成如此大差异的源头吗? - fmoga
@MelmanRo:这取决于应用程序产生了多少变动。是可能的,是的。 - skaffman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接