gpt4 book ai didi

java - 文件 deleteOnExit() 函数即使在文件被删除后仍保持引用指针打开

转载 作者:太空狗 更新时间:2023-10-29 11:18:54 25 4
gpt4 key购买 nike

  1. 我正在使用 java.io.File.createTempFile() 在我的应用程序中创建临时文件。
  2. 在创建文件时,我为该文件对象调用了 deleteOnExit()

这段代码在我的应用中有很多场景用到。有时,临时文件的大小太大,所以我必须在工作完成后立即删除它。所以我正在为某些对象调用 File.delete()

现在的问题是,当我使用 delete() 函数删除文件时,这个已删除文件的引用指针是打开的(因为它是临时文件(我的意见))。因此,我面临内存泄漏问题。

(Correct me if I am wrong on my above hypothesis)

我的环境中磁盘利用率很高,我发现“df”和“du”命令的输出存在超过 30GB 的差异(“df”查看 FS 本身的状态,而“du' 忽略已删除的文件描述符)。

  1. 如果删除 deleteOnExit(),我将不得不手动删除所有对象。这样做,我的指针仍然保持打开状态(在 linux 上使用 lsof +al1 查看打开的文件)为什么会这样?
  2. 如果我删除 delete(),那么我将不得不等到 VM 停止才能删除临时文件(这在生产服务器中很少见)。 (巨大的空间利用率)

如果我手动删除文件,是否有关于如何从 deleteOnExit() 列表中删除文件的解决方案?

最佳答案

我怀疑您的分析是正确的,这可以看作是 Java 中的错误:一旦您调用 delete , 期望由 deleteOnExit 创建的引用是公平的将被删除。

但是,我们至少(有点)被警告了。 Javadoc for deleteOnExit 说:

Once deletion has been requested, it is not possible to cancel the request. This method should therefore be used with care.

所以我想调用 deletedeleteOnExit 之后会被认为粗心。

但是,在我看来,您的问题暗示了它自己的解决方案。你说:

If I remove delete(), then I will have to wait until VM stops to get tempFiles deleted(which is a very rare case in Production Server).

如果 JVM 很少结束,那么 deleteOnExit很少会对你有任何好处。这表明解决方案是通过让您的应用程序调用 delete 来处理您自己的删除。当它完成一个文件时,请注意使用 deleteOnExit完全没有。

关于java - 文件 deleteOnExit() 函数即使在文件被删除后仍保持引用指针打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26990618/

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