java - 在 Eclipse 中使用 get Thread Alsigned Bytes() 获取编译错误

标签 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 编译项目。

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

最佳答案

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/

相关文章:

java - Android - 打开刚刚创建的文件时出错

python - 找出Python对象的创建位置

c - malloc'ing 和 realloc'ing 指针在返回时导致内存泄漏

c++ - Debug模式下的内存泄漏

java - activemq 代理启动后是否可以创建虚拟目的地和复合队列?

java - Eclipse 项目未在 Mac OS X 上构建 : 'A resource exists with a different case' error

java - fragment 返回与 View (CardStackAdapter)相关的所有方法作为空对象引用

java - 我应该如何在 Eclipse 中向 Android 个人词典添加单词?

android - 在 Android 中处理一个核心项目和多个从中派生的项目

java - 将 GAE 项目迁移到 Java 8 - 将运行时属性添加到 appengine-web.xml 后出现 XML 验证错误