0

最近,我一直在使用Eclipse MAT深入研究 JVM 堆转储。我喜欢它,但我似乎使用最多的一个功能是Dominator Tree。Eclipse 的示例截图:

Eclipse Dominator 树示例截图

无论如何,我发现很多时候,我通常会从查看该表并获取前几个条目中获得最大价值。因为得到这个的周转时间是:

  1. 创建堆转储 ( jcmd <pid> GC.heap_dump)
  2. 下载/拉取 heapdump 到一个位置(MAT 没有安装在我们的服务器上)
  3. 运行 Eclipse MAT 的ParseHeapDump.sh工具来构建各种树
  4. 打开 MAT,单击Dominator Tree图标。
  5. 分析

有没有办法以编程方式从正在运行的JVM中获取这些等效信息?我想gather_dominators.sh <pid>在主机上运行某种脚本并从 JVM 获取 Top X 对象,但我不知道从哪里开始。

4

1 回答 1

2

如果通过“运行jvm ”您的意思是 -“在不执行 stop-world heap-dump 的情况下获取信息”,那么显而易见的答案是:为了在没有“全扫描”的情况下执行此类操作 - 需要在整个系统生命周期内收集数据- 通过点击每个对象的创建/发布和维护统计数据来计时。您可以通过仪器或使用现成的自定义代理(jol/jamm/etc)来实现这些目标。请注意,许多 GC 已经在做类似的工作来收集(和打印)统计信息。IIRC - 较新的 JVM 甚至在类元数据区域内跟踪此类信息(因此获取统计信息是即时的)。


另一方面-如果您可以获取堆转储(在任何具有适当节点冗余的生产系统上应该可以,用于处理不可避免的 Sun-JVM 停止世界 GC 暂停),然后 Jhat, MAT-api、YourKit 和 Jol 可能是你最好的朋友:

需要注意的是,当前存在的堆转储格式会丢失有关对象实际大小的信息,因此所有工具(MAT/etc)都只是试图正确地猜测它:

HTH :)

于 2015-08-07T03:08:59.370 回答