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