2014-10-25 2 views
-3

Рекомендуется предупредить, что в программе необходимо закрыть поток в целях предотвращения серьезных утечек ресурсов. Но как происходит утечка ресурсов? Будем очень благодарны за любые примеры кода. Благодарю.Как происходит утечка ресурса?

ответ

2

Рассмотрим это:

File[] lotsAndLotsOfFiles = ... 

for (File f: lotsAndLotsOfFiles) { 
    InputStream is = new FileInputStream(f); 
    // Use `is` ... But don't close it 
} 

Что происходит с вышесказанным, что вы в конечном итоге с большим количеством открытых файлов. Под капотом каждый из этих открытых файлов имеет связанный файловый дескриптор. В Linux (например) ОС только позволяет процессу иметь ограниченное количество дескрипторов файлов в любой момент времени. Если процесс уже использовал свою квоту файловых дескрипторов, дальнейшие попытки открыть файл не удастся.

На уровне Java сборщик мусора (GC) завершит любой OutputStream, InputStream, Reader или Writer, что он находит, что мусор. И финализатор вызовет close(), который выпустит дескриптор файла. Но проблема в том, что сборщик мусора иногда работает. Поэтому, если вы пропустите слишком много файловых дескрипторов между последовательными сеансами GC, ваше приложение закончится и, вероятно, умрет.

Существует множество примеров правильных путей предотвращения утечки ресурсов в Java.

+0

Это (то, что вы заявили для Linux) происходит в других ОС? И FileOnputStream так же, как FileInputStream (возможно, вы допустили ошибку ввода) –

+0

Определенно относится к другим UNIX и UNIX-подобным oses ... включая Mac OSX. В Windows тоже есть ограничения, но я не уверен, как они реализованы. –

Смежные вопросы