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

时间:2018-07-05 10:03:42

标签: java python processbuilder memory-consumption cpu-time

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

1 个答案:

答案 0 :(得分:1)

如果您使用的是Java 9或更高版本,请使用Process::info()获取该流程的ProcessHandle.Info对象(如果有)。根据JVM在您的OS平台上支持的内容,这可能会为您提供该进程的总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等效命令:


为记录起见,这(大致而言)是通过ProcessBuilder使用time的方式:

   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”选项。

相关问题