我有一个使用 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中表数组的对象ID。即使这也不太有效,因为它只能找到直接附加到表的对象,而不是链接的对象。无论如何,我觉得我让这件事变得比它必须的更难 - 我以为有一个简单的方法可以做到这一点。
扩展 geert3 答案:
您可以使用Memory Analyzer来做到这一点。选择“dominator_tree”并搜索您的 HashMap。
选择 -> 右键单击 -> Java 集合 -> 哈希条目
我是一名优秀的程序员,十分优秀!