2017-01-30 15 views
2

Я пытаюсь понять, как не вызвать функцию 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. Я мог видеть, что GC работает правильно. Нет утечек памяти, как ожидалось.

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

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

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

+3

Попробуйте сохранить все ссылки из GC'd (например: добавьте их в 'ArrayList' и посмотрите, меняется ли ваша производительность. – CollinD

ответ

3

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

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