【发布时间】:2015-01-15 10:09:20
【问题描述】:
- 我正在使用
java.io.File.createTempFile()在我的应用程序中创建临时文件。 - 在创建文件时,我为该文件对象调用了
deleteOnExit()。
此代码在我的应用程序中的许多场景中使用。有时,临时文件的大小太大,所以我必须在我的工作完成后立即删除它。所以我为某些对象调用File.delete()。
现在的问题是,当我使用delete() 函数删除文件时,这个已删除文件的引用指针是打开的(因为它是临时文件(我的观点))。因此,我面临内存泄漏问题。
(如果我对上述假设有误,请纠正我)
我在我的环境中面临高磁盘利用率,我发现“df”和“du”命令的输出中存在超过 30GB 的差异(“df”查看 FS 本身的统计信息,而“ du' 忽略已删除的文件描述符)。
- 如果我删除 deleteOnExit(),我将不得不手动删除所有对象。这样做,我的指针仍然保持打开状态(在 linux 上使用
lsof +al1查看打开的文件)为什么会发生这种情况? - 如果我删除 delete(),那么我将不得不等到 VM 停止才能删除 tempFiles(这在生产服务器中非常罕见)。 (巨大的空间利用率)
如果我手动删除文件,是否有关于如何从 deleteOnExit() 列表中删除文件的解决方案?
【问题讨论】:
-
我在this answer 中详细说明了
File.deleteOnExit()和使用StandardOpenOption.DELETE_ON_CLOSE在进程终止时的行为不同。这表明它们的实现方式不同,所以也许后者也可以解决您的问题。 -
您的选项的问题是: 当打开由其他实体同时打开的文件时,不建议使用此选项。关于何时以及如何删除文件的许多细节是特定于实现的,因此未指定。