0

我正在使用 processBuilder 在 java 上执行 python/perl 脚本。我想知道执行的进程的内存使用情况和 CPU 时间。Java mx bean 仅限于 jvm。因此,我认为它不能用于脚本执行。请帮忙。

4

1 回答 1

1

如果您使用的是 Java 9 或更高版本,请使用Process::info()获取ProcessHandle.Info进程的对象(如果可用)。根据您的操作系统平台上 JVM 支持的内容,这可能会为您提供进程的总 CPU 时间,以及进程的启动时间……在某些情况下,您可以使用它来计算经过的时间。


Linux 系统上的另一种选择是将命令作为“/usr/bin/time your command”执行,并解析标准输出的最后三行以获得经过时间、“用户”CPU 时间和“系统”CPU 时间。

例如:

$ time date
Thu Jul  5 20:25:01 AEST 2018

real    0m0.002s
user    0m0.001s
sys     0m0.001s

捕获并解析最后 3 行。(在 Java 中实现这个留作练习......)

time命令的 GNU 版本也具有可用于显示内存使用情况的选项。这在手册条目中进行了描述。

此处描述了一些适用于 Windows 的等效命令:


作为记录,这(粗略地说)是time使用 ProcessBuilder 的方式:

   ProcessBuilder pb = new ProcessBuilder(
           "sh", "-c", "/usr/bin/time python filename.py");

或者

   ProcessBuilder pb = new ProcessBuilder(
           "/usr/bin/time python filename.py");

如果要使用“sh -c”在子shell 中运行命令,shell 输入字符串必须是单个命令参数。由于ProcessBuilder不理解引用,这意味着您必须自己进行拆分;往上看。

要获取 GNU 时间来输出内存参数,您需要使用格式字符串,如“man time”中所述;例如

  /usr/bin/time -f "%e %s %u %M" command to be run

请注意,使用“/usr/bin/time”而不是“time”很重要,因为某些 shell 中的内置“time”命令不理解“-f”选项。

于 2018-07-05T10:33:17.867 回答