java - 如何从 Java 堆转储中提取 HashMap

标签 java hashmap jvisualvm 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中表数组的对象ID。即使这也不太有效,因为它只能找到直接附加到表的对象,而不是链接的对象。无论如何,我觉得我让这件事变得比它必须的更难 - 我以为有一个简单的方法可以做到这一点。

最佳答案

扩展 geert3 答案:

您可以使用Memory Analyzer来做到这一点。 选择“dominator_tree”并搜索您的 HashMap。

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

Screenshot of Memory Analyzer

关于java - 如何从 Java 堆转储中提取 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35992182/

相关文章:

java - 自定义 SMTPAppender 中的 scheduleAtFixedRate 不会延迟

java - 将 List<Object[]> 转换为 HashMap<Integer,List<String>> 什么是最佳方法?

java - 具有来自 List<List<String>> 的频率计数的唯一值

Java:监视静态字段状态

java - Unix 中的 jvisualvm

java - 调试 : Mergesort

java - 具有 3 个表和复合主键的定义问题 JPA

java - While 循环字符串检查

java - Java 中深度嵌套的 hashmap

java - jvisualvm 无法与 eclipse 一起使用