如何从Java堆转储中提取HashMap

3
我有一个使用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。但这并不完全有效,因为它只能找到直接附加到表的对象,而不能找到链式对象。无论如何,我感觉自己把这件事想得太难了 - 我认为应该有一种简单的方法来解决这个问题。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - geert3
@geert3 - 所以我查了一下,MAT可以做到这一点。它有许多Java集合的辅助工具。感谢您的提示! - paj28
2个回答

2

扩展geert3的回答:

你可以使用内存分析器来实现。 选择“dominator_tree”并搜索你的HashMap。

选择 -> 右键 -> Java集合 -> 哈希条目

Memory Analyzer的屏幕截图


0

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


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