gpt4 book ai didi

java - 已删除的文件保留文件描述符直到垃圾回收

转载 作者:行者123 更新时间:2023-12-01 06:07:02 25 4
gpt4 key购买 nike

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

需要明确的是,我观察到了这种行为

  1. 正在运行lsof并查看已删除的文件(标记为 deleted )。另外df -h显示占用空间的文件。
  2. 正在运行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();
}

最佳答案

“这是一个问题,因为操作系统(debian)在文件描述符被释放之前无法回收该空间”

这是你的问题,这是不正确的。文件描述符只是一个整数,每个进程都会得到一个(它取决于进程,而不是操作系统方面的)。在这种情况下,操作系统将回收空间,这正是文件描述符的用途(而不是指向文件字节数组的指针)。

如果这仍然困扰着您,请发布您的 java 代码和 shell 代码,以便清楚问题所在。

关于java - 已删除的文件保留文件描述符直到垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42405065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com