删除文件持有文件描述符直到垃圾回收

时间:2017-02-23 00:46:04

标签: java garbage-collection

我有一个java服务,可以下载非常大的文件,进行一些处理,然后删除它们。我注意到服务保留了文件描述符,直到垃圾收集运行。这是一个问题,因为OS(debian)无法回收该空间,直到文件描述符被释放。在文件对象超出范围后,如何强制JVM回收该空间?我不想使用system.gc()

要清楚,我已经通过

观察到了这种行为
  1. 正在运行lsof并查看已删除的文件(标记为deleted)。另外df -h显示占用空间的文件。
  2. 正在运行jcmd <pid> GC.run
  3. 正在运行lsof并且不再看到该文件。 df -h显示已释放的磁盘空间。
  4. 这是Java代码的简化版本:

    public void downloadAndProcess() throws IOException {
        File destinationFile = new File("blah");
        s3Client.getObject(
                new GetObjectRequest(bucket, key),
                destinationFile
        );
        // do some processing
        destinationFile.delete();
    }
    

1 个答案:

答案 0 :(得分:-1)

&#34;这是一个问题,因为操作系统(debian)无法回收该空间,直到文件描述符被释放为止#34;

这是你的问题,这是不正确的。文件描述符只是一个整数,每个进程得到一个(它取决于进程,而不是os-)。在这种情况下,Os会回收空间,而这正是文件描述符的用途(不是指向文件bytearray的指针)。

如果仍有任何问题,请发布您的java代码和您的shell代码,以便明确问题是什么。