我正在尝试在 Quartz 调度程序中监视我的线程。我需要估计执行作业所需的内存量。
我正在尝试使用该方法:
import java.lang.management.ManagementFactory;
ManagementFactory.getThreadMXBean().getThreadAllocationBytes();
但是,在 Eclipse 中我收到错误:
The method getThreadAllocationBytes() is undefined for the type ThreadMXBean
我搜索了一下,发现该方法是在JDK6u25中引入的,并且由于Eclipse使用自己的编译器,因此无法修复该问题。
在没有 Eclipse 的情况下编译类似乎是一个较弱的解决方案,因为我需要能够使用 Eclipse 编译项目。
您能给我一些关于如何解决这个问题的建议吗?
最佳答案
ManagementFactory
为您提供了 java.lang.management.ThreadMXBean
,但您要调用的方法位于 com.sun.management.ThreadMXBean 内部
接口(interface)(扩展了 java.lang.management.ThreadMXBean
接口(interface))。
如果您在 Sun/Oracle VM 上运行,您可以转换结果并调用方法:
((com.sun.management.ThreadMXBean)ManagementFactory.getThreadMXBean())
.getThreadAllocatedBytes();
但是这在其他虚拟机上当然会失败。另外,不建议使用 com.sun 包,因为那里的类可能随时更改(即使是在对 VM 进行小幅更新时)。因此,在使用它并让您的代码不依赖它时最好小心。
编辑 如果您仍然无法编译它,但它可以使用反射工作,那么有一个比反射更好的方法。 Java 管理 API 对按名称访问 bean 和属性有特殊支持,因为您经常希望在编译时不知道它们的情况下显示它们(想想像 JConsole 或 VisualVM 这样的通用 JMX 客户端)。
使用以下代码:
ObjectName threadMxBean = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME);
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
long[] memUsedPerThread = (long[]) mbeanServer.getAttribute(threadMxBean, "ThreadAllocatedBytes");
这应该可行,但我无法测试它,因为在我的 JVM 上,该属性不存在。如果它不起作用,请使用 JConsole 或 VisualVM,连接到您的 Java 进程并验证该属性确实存在且名称正确。
您还可以查看 JMX documentation .
编辑 2
在您的代码示例中,您使用了 getThreadAllocationBytes
,但 API 链接显示 getThreadAllocationBytes
。仔细检查你是否做对了。我的回答有误,我现在改正了。
关于java - 在 Eclipse 中使用 get Thread Alsigned Bytes() 获取编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11562215/