为ManagementFactory
您提供了java.lang.management.ThreadMXBean
,但您要调用的方法位于com.sun.management.ThreadMXBean
接口内部(扩展了java.lang.management.ThreadMXBean
接口)。
如果您在 Sun/Oracle VM 上运行,您可以转换结果并调用方法:
((com.sun.management.ThreadMXBean)ManagementFactory.getThreadMXBean())
.getThreadAllocatedBytes();
但这当然会在其他虚拟机上失败。此外,不建议使用 com.sun 包,因为那里的类可能随时更改(即使是对 VM 的微小更新)。所以最好在使用它并让你的代码不依赖它时小心。
编辑
如果您仍然无法编译它,但它使用反射工作,那么有比反射更好的方法。Java 管理 API 对通过名称访问 bean 和属性具有特殊支持,因为您通常希望在编译时不知道它们的情况下显示它们(想想通用 JMX 客户端,如 JConsole 或 VisualVM)。
使用以下代码:
ObjectName threadMxBean = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME);
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
long[] memUsedPerThread = (long[]) mbeanServer.getAttribute(threadMxBean, "ThreadAllocatedBytes");
这应该可行,但我无法测试它,因为在我的 JVM 上,该属性不存在。如果它不起作用,请使用 JConsole 或 VisualVM,连接到您的 Java 进程并验证该属性确实存在且名称正确。
您还可以查看JMX 文档。
编辑 2
在您的代码示例中,您使用getThreadAllocationBytes
了 ,但指向 API 的链接显示getThreadAllocatedBytes
。仔细检查您是否正确。我的答案是错误的,我现在修复它。