Открытые файлы Java не очищаются, даже когда процесс убит
Существует Java-программа, которая читает файлы из папки, выполняет некоторую обработку и записывает выходные файлы в другую папку. Это работало в течение 4 часов и произвело несколько файлов, но затем отказало после выдачи следующей ошибки:
"too many files"
Затем я изменил программу, чтобы закрыть все (BufferReader и BufferWriter) и снова запустил процесс. Но этот процесс не удался сразу после запуска, выдав следующую ошибку:
java.io.FileNotFoundException: <file> (Too many open files)
Затем я попытался запустить lsof и искал процесс, который практически не имеет открытых файлов. Я понял, что это NetworkManager. Но я не был уверен, должен ли я убить этот процесс или нет. Поэтому я перезапустил машину. Даже после этого, когда я запустил Java-программу, я все еще получал ту же ошибку.
В худшем случае может случиться так, что в моем коде все еще есть некоторые утечки с точки зрения того, что он не закрывает все, но он все равно дает сбой сразу после запуска процесса. Так что у меня такое ощущение, что что-то лежит в системе с предыдущего запуска. Кроме того, если я запускаю тот же процесс на каком-то другом компьютере, он запускается в течение нескольких часов, прежде чем происходит сбой.
1 ответ
Вы не можете сохранить ресурс между запусками программы, даже если бы захотели. Вы можете оставить свою систему без достаточных ресурсов в теории, хотя это маловероятно, но перезапуск машины должен исправить это.
Что более вероятно, так это то, что у вас есть достаточно файлов, чтобы запустить программу из-за файловых дескрипторов. Попробуйте переименовать каталог, в котором вы храните файлы, и начните с пустого, чтобы подтвердить это.