2017-02-23 7 views
0

У меня есть служба java, которая загружает очень большие файлы, выполняет некоторую обработку, а затем удаляет их. Я заметил, что служба держится за дескриптор файла, пока не запустят сбор мусора. Это проблема, потому что ОС (debian) не может вернуть это пространство до тех пор, пока не будет выпущен дескриптор файла. Как заставить JVM восстановить это пространство после того, как объект файла выходит из области видимости? Я бы предпочел не использовать system.gc().Удаленный файл, хранящийся в файловом дескрипторе до сбора мусора

Чтобы было ясно, что я наблюдал это поведение

  1. работает lsof и видеть удаленные файлы (отмеченные как deleted). Также df -h показывает файлы, занимающие место.
  2. running jcmd <pid> GC.run
  3. 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(); 
} 
+4

Вы закрываете файлы? Либо вручную вызываете close(), либо используя try-with-resources? –

+0

В деле удаления нет дескриптора файла, хотя есть отчеты о реализации Windows, которые хранятся на ресурсах через «Файл» до GC. – EJP

+0

Если вам не нравится ответ, пожалуйста, прокомментируйте почему. Сборщик мусора JVM избавляется от бесполезных дескрипторов файлов (только небольших целых чисел), но он не имеет особого отношения к блокировке или удалению файлов. – iantonuk

ответ

-1

«Это проблема, потому что ОС (Debian) не может вернуть это пространство, пока дескриптор файла не будет отпущена»

Это твоя проблема, это неправильно. Дескриптор файла - это целое число, каждый процесс получает один (и зависит от процесса, а не от нуля). Os освободит место в этой ситуации, и это именно то, что для дескрипторов файлов (а не для указателей на файл bytearray).

Если это все равно вас пугает, отправьте свой код Java и код оболочки, чтобы было ясно, в чем проблема.

+0

Нет, моя ОС не вернет пространство до тех пор, пока GC не произойдет. Если я выдаю 'sudo df -h /', я вижу, что пространство не было выпущено. –

+0

Это ваш ответ прямо там. прочитайте http://askubuntu.com/questions/280342/why-do-df-and-du-commands-show-different-disk-usage#390301 – iantonuk

+0

Этот ответ не совсем корректен, потому что его файловые дескрипторы не называются иначе (файловый дескриптор представляет собой маленькое целое число из 4 байтов, оно не занимает больше четырех байтов - 0x00000003 для вашего первого открытого файла). Но пункт этой команды дает что-то другое, чем вы думаете. Вы можете получить это пространство. (Используйте команду du) – iantonuk

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