【问题标题】:Cleaning up lock (.lck) files in Java 8在 Java 8 中清理锁 (.lck) 文件
【发布时间】:2015-02-24 23:15:08
【问题描述】:

看来 java 8 改变了锁文件的处理方式,导致我积累了很多 .lck 文件。

我想通过在我的应用程序中添加一些代码来解决这个问题,以便在每次运行时清理我的输出目录中的锁定文件。但是,Java 不会保持此文件处于打开状态,这意味着如果我打开我的应用程序的第二个实例(常见用例),那么这将导致它删除锁定文件并在尝试重新使用与另一个相同的日志文件时立即挂起实例。

有没有人以更优雅的方式缓解这种情况?


确认这是至少 8u25 中的错误。 oracle 8u40 JRE 中的不良行为消失了。

【问题讨论】:

  • 没有锁文件这样的“文件类型”。 .lck 只是一个文件扩展名,仅此而已。那是哪个操作系统?它与日志记录有什么关系?
  • 你的意思是log file吗?
  • .lck 文件被 java logging api 用来显示日志文件当前正在被 java 进程使用(至少在 windows 上)

标签: java java-8 java.util.logging


【解决方案1】:

Is java.util.logging.FileHandler in Java 8 broken? 对此进行了介绍。将您的 JDK 8 更新为 update 40 or newer,其中包含 fix for JDK-8048020

当 FileHandler 打开时,您应该会看到锁定文件。如果您在 VM 退出后看到它们仍然存在,那是因为 FileHandler 未关闭,VM 在处理程序关闭挂钩运行时停止或崩溃,或者在尝试删除它们时发生 I/O 异常。

当涉及到 FileHandler 使用的FileLock 的实现时,您所运行的平台也会发挥作用。 FileLock 文档带有以下警告:

锁是否真正阻止另一个程序访问锁定区域的内容取决于系统,因此未指定。某些系统的本机文件锁定工具只是建议性的,这意味着程序必须协同遵守已知的锁定协议以保证数据完整性。在其他系统上,本地文件锁是强制性的,这意味着如果一个程序锁定了文件的某个区域,那么实际上会阻止其他程序以违反锁的方式访问该区域。在其他系统上,本机文件锁是建议性的还是强制性的,可以根据每个文件进行配置。为确保跨平台的一致和正确行为,强烈建议将此 API 提供的锁用作建议锁。

这意味着 FileHandler 在不同的平台上可以有不同的锁定行为。

与锁定文件相关的还有日志记录器的垃圾收集,它不会关闭附加的处理程序。这些问题在 JDK-8060132: logging.properties 中的抽象节点上配置的处理程序并不总是正确关闭,JDK-6274920: JDK 记录器对 java.util.logging.Logger 实例有很强的引用。

【讨论】:

  • 该链接表明锁定递增行为是从 7 更改为 8。我没有遇到锁定文件在干净关闭时到期的问题。星期四我会在 u45 上测试,看看有什么不同。
  • "当 FileHandler 打开时,您应该会看到锁定文件。如果您在 VM 退出后看到它们仍然存在,那是因为 FileHandler 没有关闭,VM 在处理程序关闭挂钩正在运行,或者在尝试删除它们时发生 I/O 异常。”正确,这是我期望和看到的行为。以前在 java 7 中,这些锁定文件会被重新使用,因为 VM 会检查文件是否保持打开状态。现在它永远不会重复使用锁文件,锁的存在会导致它递增到下一个。
  • 这是在 oracle JRE 8u25 上观察到的。
  • 抱歉所有的回复,经过进一步测试,我似乎(不出所料)有什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 2012-04-29
  • 1970-01-01
  • 2015-10-18
  • 2014-12-10
相关资源
最近更新 更多