Тест на утечку ресурсов

Я пытаюсь понять, как отказ от вызова close () для каких-либо потоков может повлиять на производительность и функциональность системы. Для этого я создал тестовый класс ниже.

public static void main(String[] args) throws Exception {

      int loopCount = 1000000;
      for (int i = 0; i < loopCount; i++) {

        PrintWriter writer = new PrintWriter("C:/files/the-file-name" + i +".txt", "UTF-8");
        writer.println("The first line");
        writer.println("The second line");
        writer.close();
        FileInputStream is = new FileInputStream("C:/files/the-file-name" + i +".txt");
    }
}

Я наблюдал за этой программой с помощью VisialVM. Я мог видеть, что сборщик мусора работает правильно. Никаких утечек памяти, как ожидалось.

НО Тогда я подумал, что, по крайней мере, я должен увидеть некоторые исключения, потому что я в основном исчерпываю доступные файловые дескрипторы, доступные моему процессу java. Почему здесь нет исключения? Программа продолжает работать!

Другая проблема заключается в том, что хотя у меня есть FileInputStream для каждого нового созданного файла, если я пойду и попытаюсь удалить какой-либо из файлов, на стороне ОС не будет блокировки, чтобы помешать мне.

Может ли кто-нибудь объяснить, действителен ли мой тест или нет? И объясните, пожалуйста, об утечке ресурсов в случае невозможности вызова закрытия на каких-либо потоках.


person Vahid    schedule 30.01.2017    source источник
comment
Постарайтесь уберечь все ссылки от сборки мусора (например: добавьте их в ArrayList и посмотрите, не изменится ли ваша производительность.   -  person CollinD    schedule 30.01.2017


Ответы (1)


У большинства потоков есть метод finalize(), который закроет их для вас, поэтому в этом коде потоки могут быть GC'd и закрыты автоматически, когда переменная выпадает из области видимости во время каждой итерации цикла.

Это не означает, что вы не должны быть осторожны с высвобождением ресурсов. Это просто безопасность.

person Kayaman    schedule 30.01.2017