如何从 Java 堆转储中提取 HashMap

How to extract a HashMap from a Java heap dump

我有一个使用 jmap 生成的 Java 堆转储。这包含一个 HashMap,我需要将其提取为文本格式(CSV 就可以)。 HashMap 相当大,所以我需要一个脚本解决方案。

使用 JVisualVM 我可以找到 HashMap。但是,似乎没有办法导出其数据。经过一些实验后,我确实计算出了这个 OQL 查询:

select map(filter(heap.findObject("0x12345678"), 'it != null'), function(it) { return {"id": it.key.value, "value": it.value.value}; })

其中 0x12345678 是 HashMap 中 table 数组的对象 ID。即使这样也不太有效,因为它只能找到直接附加到 table 的对象,而不是链接的对象。无论如何,我觉得我让这件事变得比它必须的更难了——我原以为有一种简单的方法可以做到这一点。

显然还有一个 Eclipse 工具(独立的和插件的):Memory Analyzer (MAT),也许它提供了更多的导出选项。参见 http://www.eclipse.org/mat

扩展 geert3 答案:

您可以使用 Memory Analyzer 来完成。 Select“dominator_tree”并搜索您的 HashMap。

Select -> 右键单击​​ -> Java 集合 -> 哈希条目