获取Java应用程序的CPU和内存使用情况的Java API

11

我需要一个API来获取当前Java进程或应用程序的CPU和内存使用情况。

我已经有了一个API可以获取整个系统的CPU使用情况,但我需要针对特定进程的使用情况(OperatingSystemMXBean接口的getSystemCpuLoad)。

先行致谢。


4
这取决于您对内存使用的定义;您指的是常驻内存、虚拟内存、正在使用的堆或活动对象吗?这些可能非常不同。 - Peter Lawrey
这可以通过使用 Runtime.totalMemory() - freeMemory() 来获取,但请注意,这并不能让您了解堆有多满,只能让您知道距离下一次完整的 GC 还有多远。 - Peter Lawrey
3个回答

8

如果您使用不同的 OperatingSystemMXBean,则可以获取该数据。

请检查导入的包:com.sun.management.OperatingSystemMXBean

 import java.lang.management.ManagementFactory;
 import com.sun.management.OperatingSystemMXBean;

 public class Test {

 public static void main(String[] args) {
       OperatingSystemMXBean operatingSystemMXBean = 
          (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
       System.out.println(operatingSystemMXBean.getProcessCpuLoad());
 }}

如果我没记错的话,这个类包含在rt.jar中,它存在于你的Java运行时中。 https://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/OperatingSystemMXBean.html

1
编译错误:OperatingSystemMXBean 类型中未定义 getProcessCpuLoad() 方法。 - P S M
1
@PSM 请检查导入。您确定正在导入com.sun.management.OperatingSystemMXBean吗? - RubioRic
@PSM 我认为你仍在使用java.lang.management.OperatingSystemMXBean。 - RubioRic
有没有Java 8的解决方案?上述代码会给我一个错误:“The method getProcessCpuLoad() is undefined for the type OperatingSystemMXBean”。 - Cardinal System
@CardinalSystem 你检查过导入的包了吗?我已经在Java 8中使用它了。 - RubioRic

4
有好消息和坏消息。坏消息是,使用纯Java进行CPU使用率的程序化查询是不可能的。简单来说,没有相关的API。一个替代方案可能是使用Runtime.exec()来确定JVM的进程ID(PID),调用外部的、平台特定的命令(如ps),并解析其输出以获取所需的PID。但是,这种方法本质上是脆弱的。
然而,好消息是,可以通过跳出Java并编写一些C代码行来实现可靠的解决方案,并通过Java Native Interface(JNI)与Java应用程序集成。

如果你要从https://www.infoworld.com/article/2077361/profiling-cpu-usage-from-within-a-java-application.html复制粘贴内容,至少应该提供一个链接,以便读者可以在那里查找更多信息。 - undefined

0

一旦您获得了pid,您可以使用jstat -gc [insert-pid-here]来查找垃圾收集堆行为的统计信息。

jstat -gccapacity [insert-pid-here]将呈现有关内存池生成和空间功能的信息。

jstat -gcutil [insert-pid-here]将以其容量的百分比呈现每个代的利用率。对于快速查看使用情况非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接