gpt4 book ai didi

java - 在我的情况下使用 finalize() 吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:10:32 24 4
gpt4 key购买 nike

我有一个 ImageWrapper 类,可将图像保存到磁盘中的临时文件以释放堆内存,并允许在需要时重新加载它们。

class ImageWrapper {
File tempFile;
public ImageWrapper(BufferedImage img) {
// save image to tempFile and gc()
}
public BufferedImage getImage() {
// read the image from tempFile and return it.
}
public void delete() {
// delete image from disk.
}
}

我担心的是,当这样的 ImageWrapper 实例被垃圾回收时,如何确保文件被删除(否则我就有可能用不需要的图像填满磁盘)。这必须在应用程序仍在运行时完成(而不是在终止期间清理建议),因为它可能会运行很长时间。

我对 java 的 GC 概念并不完全熟悉,我想知道 finalize() 是否是我要找的。我的想法是从覆盖的 finalize() 方法中调用 delete()(就此而言,在单独的线程上)。这是正确的做法吗?

更新:

我不认为我可以像许多用户建议的那样close() 对象,因为每个这样的图像都被提取到我无法控制的听众列表中,并可能保存对该对象的引用。我唯一确定能够删除文件的时间是没有引用时,因此我认为 finalize() 是正确的方法。有什么建议吗?

更新 2:

finalize()在哪些场景下不会被调用?如果唯一可能的是退出程序(以预期/意外的方式),我可以接受它,因为这意味着我冒着只有一个不需要的临时文件未被删除的风险(在退出期间处理的那个)。

最佳答案

另一种方法是使用 File.deleteOnExit()它标记了 JVM 在退出时删除的文件。我知道这不是您要找的完全,但您可能会感兴趣。

需要明确的是,如果您的 JVM 意外终止,它不会清除这些文件。因此,您可能希望构建解决方案以在启动时 清除缓存文件,这样您就不会随着时间的推移积累大量未使用的缓存文件。

关于java - 在我的情况下使用 finalize() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18037352/

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