У меня есть служба java, которая загружает очень большие файлы, выполняет некоторую обработку, а затем удаляет их. Я заметил, что служба держится за дескриптор файла, пока не запустят сбор мусора. Это проблема, потому что ОС (debian) не может вернуть это пространство до тех пор, пока не будет выпущен дескриптор файла. Как заставить JVM восстановить это пространство после того, как объект файла выходит из области видимости? Я бы предпочел не использовать system.gc()
.Удаленный файл, хранящийся в файловом дескрипторе до сбора мусора
Чтобы было ясно, что я наблюдал это поведение
- работает
lsof
и видеть удаленные файлы (отмеченные какdeleted
). Такжеdf -h
показывает файлы, занимающие место. - running
jcmd <pid> GC.run
lsof
и больше не видя файл.df -h
показывает дисковое пространство.
Вот упрощенная версия Java Код:
public void downloadAndProcess() throws IOException {
File destinationFile = new File("blah");
s3Client.getObject(
new GetObjectRequest(bucket, key),
destinationFile
);
// do some processing
destinationFile.delete();
}
Вы закрываете файлы? Либо вручную вызываете close(), либо используя try-with-resources? –
В деле удаления нет дескриптора файла, хотя есть отчеты о реализации Windows, которые хранятся на ресурсах через «Файл» до GC. – EJP
Если вам не нравится ответ, пожалуйста, прокомментируйте почему. Сборщик мусора JVM избавляется от бесполезных дескрипторов файлов (только небольших целых чисел), но он не имеет особого отношения к блокировке или удалению файлов. – iantonuk