Обработка утечки при запуске внешних команд из Java - PullRequest
0 голосов
/ 12 декабря 2018

Я замечаю утечку дескриптора с моей Java-программой, когда пытаюсь выполнить внешний процесс.Мой пример кода приведен ниже.Не могли бы вы подсказать мне, что я делаю неправильно?

Я запускаю эту программу, используя Open JDK 10 на ОС Windows 10.Есть ли способ свернуть ручку?

import java.util.*;
import java.io.*;

public class Test {

    public static void main(String args[]) {
        while (true) {
            Process p = null;
            try {
                // p = new ProcessBuilder("ipconfig").start();
                p = Runtime.getRuntime().exec("cmd /c ipconfig");
                BufferedReader br[] = new BufferedReader[2];
                br[1] = new BufferedReader(new InputStreamReader(p.getErrorStream()));
                br[0] = new BufferedReader(new InputStreamReader(p.getInputStream()));

                int errCode = p.waitFor();
                try {
                    br[0].close();
                } catch (Exception a) {}
                try {
                    br[1].close();
                } catch (Exception a) {}
            } catch (Exception grrr) {}

            finally {
                try {
                    closeStreams(p);
                    p.destroy();
                } catch (Exception r) {
                }
            }
        }
    }

    static void closeStreams(Process p) throws IOException {
        p.getInputStream().close();
        p.getOutputStream().close();
        p.getErrorStream().close();
    }
}

1 Ответ

0 голосов
/ 14 декабря 2018

Кажется, есть проблема в операционной системе или машине, где я запустил программу.При запуске на другой машине с OpenJDK 10 утечки ручки не было, но число ручек увеличилось до максимального значения 2800 и уменьшилось до 450.

При экспериментировании заметил ниже.

  • ИспользованиеOracle HotSpot JDK 7 и 8, нет утечки дескриптора, хотя я закрываю только поток ввода-вывода и ошибки - (не закрывая поток вывода, поскольку я не буду использовать его в своем коде), но при использовании OpenJDK происходит утечка того же кода10.
  • Закрытие всех трех потоков (вход, выход и ошибка) решило проблему утечки ручки .
...