最近,我一直在使用Eclipse MAT深入研究JVM堆转储。我喜欢它,但我似乎最常用的一个功能是Dominator Tree。 Eclipse的示例屏幕截图:
无论如何,我发现很多时候,我通常只是看着那张桌子并得到前几个条目就能获得最大价值。由于获得这个的周转时间是:
.ui-jqgrid .ui-jqgrid-labels .ui-th-column div { text-overflow: ellipsis }
)jcmd <pid> GC.heap_dump
工具来构建各种树有没有办法以编程方式从运行 JVM中获取此等效信息?我想在主机上运行某种ParseHeapDump.sh
脚本并从JVM获取Top X Objects,但我不知道从哪里开始。
答案 0 :(得分:1)
如果通过“ 正在运行 jvm ”你的意思是 - “获取信息而不进行停止世界堆转储“然后明显的答案是:为了在没有”全扫描“的情况下做这样的事情 - 需要通过点击每个对象的创建/发布和维护统计数据来收集整个系统生命周期中的数据。您可以通过仪器或使用现成的自定义代理(jol / jamm / etc)来实现这些功能。请注意,许多GC已经在进行类似的工作来收集(和打印)统计数据。 IIRC - 较新的JVM甚至可以在类元数据区域内跟踪此类信息(因此可以立即获取统计信息)。
另一方面 - 如果您可以抓住堆转储(在任何具有适当节点冗余的生产系统上应该没问题,专为处理不可避免的Sun-JVM而设计停止世界GC暂停,然后Jhat,MAT-api,YourKit和Jol可能是你最好的朋友:
值得注意的是,当前存在的堆转储格式会丢失有关对象实际大小的信息,因此所有工具(MAT /等)只是尝试 GUESS 它正确:
HTH:)