如何获取使用 ProcessBuilder 执行的进程的内存使用量和 cpu 时间?

How do I get the memory usage and cpu time of a process executed using ProcessBuilder?

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

如果您使用 Java 9 或更高版本,请使用 Process::info() 获取进程的 ProcessHandle.Info 对象(如果可用)。根据 JVM 在您的 OS 平台上支持的内容,可能会为您提供流程的总 CPU 时间,以及流程开始时间......您可以使用它来计算经过的时间,在一些情况。


Linux 系统上的另一种选择是将命令执行为“/usr/bin/time 你的命令”,并解析标准输出的最后三行以获取经过的时间,"user" CPU 次和 "system" 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"选项。