JVM以编程方式获取堆中最大的对象
JVM Getting the largest objects in the heap programmatically
我如何以编程方式(从java application/agent中)获得堆中最大对象的“实时”摘要(包括它们的实例数量和大小)?
类似于探查器所做的。
例如,这是 JProfiler 的屏幕截图:
通常我在真正需要的情况下使用堆转储,但现在我想弄清楚探查器究竟是如何从 运行 JVM 中检索这种信息的,而无需实际使用堆转储。
是否可以通过JavaAPI获取此类信息?如果不可能,本机代码中的替代方案是什么?代码示例最能满足我的需求,因为 java 宇宙的这个特定部分对我来说真的很新。
我有点相信,如果我有兴趣找到一些真正具体的信息 类 我可以使用仪器或其他东西,但据我所知,它使用采样,所以应该有另一种方式。
我目前在 linux 上使用 HotSpot VM 运行 java 8,但是我会找到越“通用”的解决方案 - 越好。
堆遍历没有标准Java API。但是,有一个 HotSpot 特定的诊断命令可以通过 JMX 调用:
String histogram = (String) ManagementFactory.getPlatformMBeanServer().invoke(
new ObjectName("com.sun.management:type=DiagnosticCommand"),
"gcClassHistogram",
new Object[]{null},
new String[]{"[Ljava.lang.String;"});
这将收集 class 直方图和 return 结果作为单一格式 String
:
num #instances #bytes class name
----------------------------------------------
1: 3269 265080 [C
2: 1052 119160 java.lang.Class
3: 156 92456 [B
4: 3247 77928 java.lang.String
5: 1150 54104 [Ljava.lang.Object;
6: 579 50952 java.lang.reflect.Method
7: 292 21024 java.lang.reflect.Field
8: 395 12640 java.util.HashMap$Node
...
内容等同于jmap -histo
命令的输出。
堆遍历的唯一标准API是原生的JVM TI IterateThroughHeap
函数,但是不太好用,而且效果很好比上面的诊断命令慢。
我如何以编程方式(从java application/agent中)获得堆中最大对象的“实时”摘要(包括它们的实例数量和大小)?
类似于探查器所做的。
例如,这是 JProfiler 的屏幕截图:
通常我在真正需要的情况下使用堆转储,但现在我想弄清楚探查器究竟是如何从 运行 JVM 中检索这种信息的,而无需实际使用堆转储。
是否可以通过JavaAPI获取此类信息?如果不可能,本机代码中的替代方案是什么?代码示例最能满足我的需求,因为 java 宇宙的这个特定部分对我来说真的很新。
我有点相信,如果我有兴趣找到一些真正具体的信息 类 我可以使用仪器或其他东西,但据我所知,它使用采样,所以应该有另一种方式。
我目前在 linux 上使用 HotSpot VM 运行 java 8,但是我会找到越“通用”的解决方案 - 越好。
堆遍历没有标准Java API。但是,有一个 HotSpot 特定的诊断命令可以通过 JMX 调用:
String histogram = (String) ManagementFactory.getPlatformMBeanServer().invoke(
new ObjectName("com.sun.management:type=DiagnosticCommand"),
"gcClassHistogram",
new Object[]{null},
new String[]{"[Ljava.lang.String;"});
这将收集 class 直方图和 return 结果作为单一格式 String
:
num #instances #bytes class name
----------------------------------------------
1: 3269 265080 [C
2: 1052 119160 java.lang.Class
3: 156 92456 [B
4: 3247 77928 java.lang.String
5: 1150 54104 [Ljava.lang.Object;
6: 579 50952 java.lang.reflect.Method
7: 292 21024 java.lang.reflect.Field
8: 395 12640 java.util.HashMap$Node
...
内容等同于jmap -histo
命令的输出。
堆遍历的唯一标准API是原生的JVM TI IterateThroughHeap
函数,但是不太好用,而且效果很好比上面的诊断命令慢。