我正在尝试在Quartz调度程序中监视我的线程。我需要估算出执行工作所需的内存量。
我正在尝试使用该方法:
import java.lang.management.ManagementFactory;
ManagementFactory.getThreadMXBean().getThreadAllocationBytes();
然而,在Eclipse中我收到一个错误:
The method getThreadAllocationBytes() is undefined for the type ThreadMXBean
我搜索并发现该方法是在JDK6u25中引入的,并且由于Eclipse使用自己的编译器,我无法解决问题。
编译没有Eclipse的类似乎是一个弱解决方案,因为我需要能够使用Eclipse编译项目。
你能就如何解决这个问题给我一些建议吗?
答案 0 :(得分:4)
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 Management 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的链接显示了getThreadAllocatedBytes
。仔细检查你是否正确。我的回答是错的,我现在修好了。
答案 1 :(得分:0)
您可以随时在Eclipse中更改项目的编译器设置,如果这正是您要查找的内容。 Project > Properties > Java Compiler > Enable Project specific settings
您还可以按如下方式更改JRE系统库:Project > Build Path > Configure Build Path > JRE System Library > Edit
。从这里,您可以选择不同的执行环境,或选择添加备用JRE。