Я пытаюсь понять, как не вызвать функцию 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 для каждого созданного нового файла, если я пытаюсь удалить любой из файлов, на стороне ОС нет блокировки для предотвращения меня.
Может ли кто-нибудь объяснить, действительно ли мой тест или нет? И объясните, пожалуйста, о утечке ресурсов в случае неспособности вызвать соединение в любых потоках.
Попробуйте сохранить все ссылки из GC'd (например: добавьте их в 'ArrayList' и посмотрите, меняется ли ваша производительность. – CollinD