Я ожидал, что моя программа в конечном итоге выдаст исключение типа
java.io.FileNotFoundException: слишком много открытых файлов,
поскольку она открывает тысячи файлов, не закрывая их, — но завершается успешно и печатает «Готово!».
вот мой код,
Код: Выделить всё
import java.io.*;
import java.util.*;
public class FileLeakTest {
public static void main(String[] args) {
ArrayList writers = new ArrayList(); // keep references alive (prevent GC)
try {
for (int i = 0; i < 100000; i++) {
FileWriter writer = new FileWriter("Test/example" + i + ".txt");
writer.write("Line " + i + "\n");
writers.add(writer);
}
System.out.println("Done!");
} catch (IOException e) {
System.out.println("Error: " + e);
}
}
}
Поскольку я открываю 100 000 файлов без вызова close(), я думал, что в ОС быстро закончатся файловые дескрипторы и выдаст исключение, например:
Код: Выделить всё
java.io.FileNotFoundException: Too many open files
Программа печатает «Готово!»
Все 100 000 файлов созданы успешно
Исключения не создаются
lsof -p показывает тысячи дескрипторов открытых файлов (тип REG)
Что я пробовал
Поддержание ссылок на запись с помощью ArrayList
Запись разных объемов данных на файл
Использование add = true в конструкторе FileWriter
Наблюдение за файловыми дескрипторами с помощью lsof -p
Тем не менее, нет IOException или ошибки «Слишком много открытых файлов»
Мой вопрос
Если большинство систем Linux устанавливают ограничение по умолчанию в 1024 файловых дескриптора на процесс,
почему моя JVM успешно открывается 100 000 FileWriters без ошибок?
Java автоматически закрывает файлы в фоновом режиме,
или моя среда каким-то образом увеличила ограничение на файловый дескриптор ОС?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -filewrite
Мобильная версия