在eclipse中使用get Thread Allocated Bytes()获取编译错误

时间:2012-07-19 13:43:49

标签: java eclipse memory-leaks threadpool

我正在尝试在Quartz调度程序中监视我的线程。我需要估算出执行工作所需的内存量。

我正在尝试使用该方法:

    import java.lang.management.ManagementFactory;

    ManagementFactory.getThreadMXBean().getThreadAllocationBytes();

然而,在Eclipse中我收到一个错误:

The method getThreadAllocationBytes() is undefined for the type ThreadMXBean

我搜索并发现该方法是在JDK6u25中引入的,并且由于Eclipse使用自己的编译器,我无法解决问题。

编译没有Eclipse的类似乎是一个弱解决方案,因为我需要能够使用Eclipse编译项目。

你能就如何解决这个问题给我一些建议吗?

2 个答案:

答案 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。