java - 使用 Java 代理获取给定 Java 类的实例数?
问题描述
是否可以使用 Java 代理来获取任何 Java 类的实例数?例如,如果我们有
class Apple {
...
}
Apple
Java 代理将返回JVM 中有多少实例。如果 Java 代理无法实现,是否可以以另一种跨平台方式进行 - 并且不启用调试模式(因此 JVMTI 和 JDI 除外)?
解决方案
为了计算实例,您需要遍历整个堆。Java 代理没有这样的功能。基本上,他们只有Instrumentation API。
使用 JVM TI 可以轻松完成该任务。IterateOverInstancesOfClass函数几乎可以满足您的需求。JVM TI 不是跨平台的,但是您可以为主要支持的平台创建一个包含动态库的 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。
推荐阅读
- python - 如何使用python解析输出?
- hibernate - 休眠多对多映射自定义HQL不返回期望输出
- cmake - 从 CPack 构建中删除 Catkin 工件
- python - 有没有办法在 Python 中使用内部函数体中的外部函数变量?
- postgresql - PostgreSQL 计算一天中部分时间的平均值
- websphere - 如何修复 J2CA0045E:为资源 jdbc/“my_datasource”调用方法 createOrWaitForConnection 时连接不可用
- javascript - 如何使用量角器删除 DOM 的元素
- amazon-web-services - 未反映上传到 Amazon S3 存储桶的最新 html 文件
- pandas - 如何仅删除不同标签的行(NaN 和 Empty 仍然存在)
- html - 在 NodeJS 中使用 Cheerio 将文本替换为 HTML