Утечка памяти при постоянном исполнениии консольной команды через java

public static String exe(String command) throws IOException, InterruptedException {
        Process process = Runtime.getRuntime().exec(command);
        InputStreamReader isr = new InputStreamReader(process.getInputStream());
        BufferedReader reader = new BufferedReader(isr);
        String output = "";
        String line;
        while ((line = reader.readLine()) != null) {
            output += line + System.lineSeparator();
        }
        process.waitFor();
        reader.close();
        isr.close();
        return output;
    }

Эту замечательную функцию я нашёл на просторах Интернета. Создал приложение, которое отслеживает некоторые параметры системы через исполнение консольных команд и читает выводы с помощью этой функции. Но появилась проблема: при постоянном её использовании растёт использование памяти. Конечно, не очень значительно (~ 1% за час где-то), но всё равно не очень приятно. Пытался разобраться в том, как её можно переписать, чтобы она память не занимала, но даже при использовании ProccessBuilder вместо Runtime, всё равно потребление растёт. Если что, зацикливаю я её с помощью while и TimeUnit создаю задержку.


Ответы (1 шт):

Автор решения: Дмитрий

Есть довольно простой способ избавиться от накопления данных.

public static void exe(Consumer<String> lineConsumer, String... command) throws IOException, InterruptedException {
    Process process = Runtime.getRuntime().exec(command);
    try (Scanner sc = new Scanner(process.getInputStream())) {
        while (sc.hasNextLine()) {
            lineConsumer.accept(sc.nextLine());
            process.waitFor();
        }
    }
}

При вызове делайте, к примеру, так:

public static void main(String[] args) throws Exception {
    exe(line -> System.out.println(line), "test_cmd");
}

Лямбда line -> System.out.println(line) определяет что делать с каждой строкой. Здесь они просто выводятся в консоль, но это только пример.

Таким образом, никакие данные накапливаться не будут

→ Ссылка