gpt4 book ai didi

java - JVM以编程方式获取堆中最大的对象

转载 作者:行者123 更新时间:2023-12-04 01:03:53 30 4
gpt4 key购买 nike

我如何以编程方式(从 java 应用程序/代理中)获得堆中最大对象的“实时”摘要(包括它们的实例数和大小)?

类似于分析器所做的。

例如,这是 JProfiler 的屏幕截图:

Live objects

通常我在真正需要堆转储的情况下使用堆转储,但现在我想弄清楚探查器究竟如何从运行中的 JVM 中检索此类信息,而无需实际进行堆转储。

是否可以使用Java API获取此类信息?如果不可能, native 代码中的替代方案是什么?代码示例最能满足我的需求,因为 Java 世界的这个特定部分对我来说真的很陌生。

我有点相信,如果我有兴趣找到关于某些真正特定类的信息,我可以使用仪器或其他东西,但据我所知,它使用采样,所以应该有另一种方法。

我目前正在使用在 Linux 上运行 Java 8 的 HotSpot VM,但是我会找到越“通用”的解决方案 - 越好。

最佳答案

堆遍历没有标准的 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;"});

这将收集类直方图并将结果作为单个格式化的 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 是 native JVM TI IterateThroughHeap 函数,但它不是那么容易使用,而且它的运行速度比上述诊断命令慢得多。

关于java - JVM以编程方式获取堆中最大的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67148994/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com