我试图获取JVM 中加载的所有类的完整列表,包括引导加载器、平台类加载器和自定义类加载器加载的类。不使用 Instrumentation API。
常规类加载器公开的方法仅返回从 main 函数开始的包引用图中可用的类。因此,我无法获取在运行时动态加载的类列表,也无法获取引导加载程序和平台类加载器加载的类。
我知道 Instrumentation API,但无法控制传递给 JVM 的命令行参数,因此它不适合我。
我没有任何特定的 Java 版本限制,因此我可以在任何“实时”版本上采取任何解决方案(假设 >=9)
这是一个特定于 HotSpot JVM 的解决方案。
适用于从 8 到 20 的所有 JDK 版本。
输出相当于 打印的内容jmap -histo:all,但结果不是打印到 stdout,而是以String.
public static String getAllClassNames() throws JMException {
return (String) ManagementFactory.getPlatformMBeanServer().invoke(
new ObjectName("com.sun.management:type=DiagnosticCommand"),
"gcClassHistogram",
new Object[]{new String[]{"-all"}},
new String[]{"[Ljava.lang.String;"});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |