从使用ProcessBuilder启动的进程获取内存使用和执行时间

时间:2014-10-28 18:41:56

标签: java memory-management

我正在使用Java中的代码执行器。问题是如何控制执行的执行时间和内存使用情况。

我正在做这样的事情:

public ExecutionResult execute(List<String> args, String inputFile) throws CommandLineExecutorException {
    try {
        ProcessBuilder builder = new ProcessBuilder(args);
        if (inputFile != null) {
            builder.redirectInput(new File(inputFile));
        }

        final long startTime = System.currentTimeMillis();
        Process process = builder.start();
        process.waitFor();
        final long endTime = System.currentTimeMillis();

        int exitValue = process.exitValue();
        InputStream inputStream = exitValue == 0 ? process.getInputStream() : process.getErrorStream();
        String consoleOutput = readStream(inputStream);
        return new ExecutionResult(exitValue, consoleOutput, (endTime - startTime));
    } catch (IOException | InterruptedException ex) {
        throw new CommandLineExecutorException(ex.getMessage());
    }
}

我不确定这是否是控制子流程执行时间的最佳方法。对于记忆,我仍然在寻找最好的选择。

当我使用php时,我曾经使用脚本来控制linux命令的内存和时间,但我想知道是否有更好的方法在java中实现这一点。

1 个答案:

答案 0 :(得分:1)

为了监视子Java进程,您可以使用Java JMX来查询JVM进程的各种参数。有关如何连接到远程JVM和this answer以检索内存信息的示例,请参阅this one

为了监控非Java进程,您可以使用SIGAR多平台API。