Утечка памяти при постоянном исполнениии консольной команды через 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) определяет что делать с каждой строкой. Здесь они просто выводятся в консоль, но это только пример.
Таким образом, никакие данные накапливаться не будут