【问题标题】:deleting a file before jvm exit on which deleteOnExit is called在调用 deleteOnExit 的 jvm 退出之前删除文件
【发布时间】:2021-12-30 01:41:20
【问题描述】:

创建一个java文件对象并调用其deleteOnExit,然后以编程方式调用delete并关闭JVM或程序退出

deleteOnExit 是否会抛出任何异常,因为文件已以编程方式删除?

【问题讨论】:

  • 你怎么看?如果 JVM 正在退出,这有关系吗?
  • 避免deleteOnExit,因为它会在长时间运行的服务器中导致OutOfMemoryError,养成使用try-finally块清理的习惯,就像answer一样。

标签: java file jvm java-io


【解决方案1】:

如果文件已被删除,则不会发生任何事情。但是,如果您重新创建它,它可能会被删除。

如果文件不存在,即使File#delete 也不会抛出异常,无法删除。在这种情况下,它只会返回 false

但是,File#deleteOnExit 保存了对 File 的引用,该引用保留在 even if you delete the file manually 中。多次执行此操作将导致越来越多的对已删除的File 对象的引用挂在堆中,从而导致内存泄漏并可能导致OutOfMemoryError(请参阅here),因为您还cannot abort File#deleteOnExit

一旦请求删除,就无法取消请求。因此,应谨慎使用此方法。

【讨论】:

  • ——“保存引用”使File.deleteOnExit() 在长时间运行的服务器可执行文件中使用时很危险:引用的File 对象可能会堆积到OOM。
  • 这就是我注意到它的原因。
  • 有些人需要明确的陈述,微妙的暗示被浪费在他们身上……?
  • 是的,我添加了这个。
猜你喜欢
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多