2

我正在尝试在 Quartz 调度程序中监视我的线程。我需要估计执行我的工作需要多少内存。

我正在尝试使用以下方法:

    import java.lang.management.ManagementFactory;

    ManagementFactory.getThreadMXBean().getThreadAllocationBytes();

但是,在 Eclipse 中出现错误:

The method getThreadAllocationBytes() is undefined for the type ThreadMXBean

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

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

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

4

2 回答 2

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 管理 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。仔细检查您是否正确。我的答案是错误的,我现在修复它。

于 2012-07-19T15:26:52.097 回答
0
  • 如果您需要的话,您可以随时在 Eclipse 中更改项目的编译器设置。Project > Properties > Java Compiler > Enable Project specific settings

  • 您还可以按如下方式更改 JRE 系统库Project > Build Path > Configure Build Path > JRE System Library > Edit:从这里您可以选择不同的执行环境或选择添加备用 JRE。

于 2012-07-19T14:45:23.420 回答