Почему Java не выдает сообщение «Слишком много открытых файлов» при открытии тысяч объектов FileWriter без их закрытия? JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему Java не выдает сообщение «Слишком много открытых файлов» при открытии тысяч объектов FileWriter без их закрытия?

Сообщение Anonymous »

Я экспериментировал с обработкой файлов Java и ограничениями файловых дескрипторов в Linux.
Я ожидал, что моя программа в конечном итоге выдаст исключение типа
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»