java - 获取进程CPU使用率

标签 java multithreading process cpu-usage jmx

我有一个程序,它加载一个包含一些信息的文本文件,并根据该信息运行多个线程。每个线程都是一个进程。这是我的代码:

public class runMultiClient {
public static void main(String[] args){
    List<Process> PRlist = new ArrayList<Process>();
    List<String[]> commandsList = new ArrayList<String[]>();
    boolean running = true;

    if (args.length == 2 && args[0].matches("-f")){
        String dir = System.getProperty("user.dir");
        String path = dir + "/" + args[1];
        FileReader fr;
        try {
            fr = new FileReader(path);
            BufferedReader bf = new BufferedReader(fr);

            String line = "";
            while ((line = bf.readLine()) != null){
                String[] tk = line.split(" ");
                String[] cmd = {"java", "-jar", "Client.jar", "-a", tk[0], "-p", tk[1],
                        "-u", tk[2], "-pw", tk[3], "-m", tk[4], "-s", tk[5]};
                Process pr = new ProcessBuilder().inheritIO().command(cmd).start();
                PRlist.add(pr);
                commandsList.add(cmd);
                System.out.println(tk[4] + " streaming process is established.");
            }
        } 
        catch (FileNotFoundException ex) {ex.printStackTrace();} 
        catch (IOException ex) {ex.printStackTrace();}
    } else {
        System.out.println("No stream file was specified.");
    }
}}

在我的 Client.jar 文件中,我有一个监视该类的 cpu 负载的变量:

OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
            cpuLoad = osBean.getProcessCpuLoad();

有什么方法可以从 runMultiClient 类访问该变量吗? 如果没有,有什么方法可以在正在运行的进程上使用 OperatingSystemMXBean 吗? 我尝试过 pr.getClass(),但没有任何结果。 任何帮助将不胜感激。

最佳答案

选项 #1:添加代理库并通过 HTTP 公开 JMX

您可以捆绑Jolokia代理与您受监控的应用程序(另一个类似的东西是 SimpleJMX 。它通过 http/json 公开 JMX beans,因此这适用于从其他语言(如 python)与 JMX 交互(并且在从类似命令进行故障排除时 super 舒适)。之后您可以访问通过 apache http 客户端等您感兴趣的 mbean。

选项#2:JMX 客户端

在启动受监控的应用程序时添加以下参数来允许远程连接:

-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false 

然后您应该能够通过 jconsole 和手写的 JMX 客户端代码访问 mbean,如 the tutorial 中所示

关于java - 获取进程CPU使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40327896/

相关文章:

java - 如何判断 Java 组件将接收的最大宽度以请求适当的高度?

java - 获取包含 "&"特殊字符的数据时遇到问题

iphone - 在 iOS4 设备上后台发送大量数据的最佳实践?

linux -/proc/PID 文件格式

python - 使用控制台在 python Windows 中创建进程

Java线程挂起而没有死锁

JavaFx任务EventHandler在哪个线程中处理

java - Java 中的异常层次结构

java - ThreadPoolTask​​Executor 中的 ConcurrentModificationException 错误

java - 使用委托(delegate)的线程安全