java - 如何获取使用 ProcessBuilder 执行的进程的内存使用情况和 CPU 时间?

标签 java python processbuilder memory-consumption cpu-time

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

最佳答案

如果您使用的是 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 中实现这个作为练习......)

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

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

<小时/>

郑重声明,这(粗略地说)是使用 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”选项。

关于java - 如何获取使用 ProcessBuilder 执行的进程的内存使用情况和 CPU 时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51188496/

相关文章:

java - Windows 上的 Marshaller 在文件末尾添加新行

java - 从 JSP 运行 java 主类

python - 如何在 tensorflow 数据集的每次迭代中添加随机性?

python - 将 PyArrow Parquet 加速到 Pandas 以获取具有大量字符串的数据帧

Java processbuilder 和使用环境变量

java - Process.destroy() 不会杀死 Process 的子进程

java - 在 ListView 中从 URL 加载图像

java - Spring MVC请求方法 'GET'不支持

python - 在单元测试中模拟对象时避免输入类型警告?

java - 在外部进程关闭之前,ProcessBuilder 的 InputStream 没有输入