使用Java代理获取给定Java类的实例数



是否可以使用Java代理来获取任何Java类的实例数?例如,如果我们有

class Apple {
...
}

Java代理将返回JVM中有多少Apple实例。如果Java代理无法做到这一点,那么是否可以以另一种跨平台的方式进行,并且不启用调试模式(因此JVMTI和JDI除外(?

为了计数实例,您需要遍历整个堆。Java代理没有这样的功能。基本上,他们所拥有的只是仪表API。

这个任务对JVM TI来说很简单。有一个IterateOverInstancesOfClass函数,它几乎可以满足您的需求。JVMTI不是跨平台的,但您可以为主要支持的平台创建一个带有动态库的JAR,并在运行时加载合适的库。例如,JNA就是这样工作的。

最接近纯Java的替代方法是HotSpot诊断命令,用于获取类直方图:

String histogram = (String) ManagementFactory.getPlatformMBeanServer().invoke(
new ObjectName("com.sun.management:type=DiagnosticCommand"),
"gcClassHistogram",
new Object[]{null},
new String[]{"[Ljava.lang.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
...

虽然这不是一个标准的API。

相关内容

  • 没有找到相关文章

最新更新