我有一個java服務,下載非常大的文件,做一些處理,然後刪除它們。我注意到服務持有文件描述符直到垃圾收集運行。這是一個問題,因爲操作系統(debian)無法回收該空間,直到文件描述符被釋放。如何強制JVM在文件對象超出範圍後回收該空間?我寧願不使用system.gc()
。刪除的文件持有文件描述符,直到垃圾收集
要清楚,我已經
- 運行
lsof
,看到被刪除的文件(標記爲deleted
)觀察到這種行爲。另外df -h
顯示佔用空間的文件。 - 正在運行
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實現的報告通過File保存到GC,但是沒有涉及刪除的文件描述符。 – EJP
如果你不喜歡答案,請評論爲什麼。 JVM垃圾收集器擺脫了無用的文件描述符(只是小整數),但它與鎖定或刪除文件沒有多大關係。 – iantonuk