我有一个java服务,可以下载非常大的文件,进行一些处理,然后删除它们。我注意到服务保留了文件描述符,直到垃圾收集运行。这是一个问题,因为OS(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();
}
答案 0 :(得分:-1)
&#34;这是一个问题,因为操作系统(debian)无法回收该空间,直到文件描述符被释放为止#34;
这是你的问题,这是不正确的。文件描述符只是一个整数,每个进程得到一个(它取决于进程,而不是os-)。在这种情况下,Os会回收空间,而这正是文件描述符的用途(不是指向文件bytearray的指针)。
如果仍有任何问题,请发布您的java代码和您的shell代码,以便明确问题是什么。