在Java 8中清理锁(.lck)文件

时间:2015-02-24 23:15:09

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

似乎java 8对锁文件的处理方式进行了更改,这导致我积累了大量的.lck文件。

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

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


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

1 个答案:

答案 0 :(得分: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异常。 / p>

运行的平台在执行FileHandler使用的FileLock时也扮演着重要角色。 FileLock文档附带以下警告:

  

锁是否实际阻止其他程序访问锁定区域的内容是系统相关的,因此未指定。某些系统的本机文件锁定功能仅仅是建议性的,这意味着程序必须协作地观察已知的锁定协议以保证数据的完整性。在其他系统上,本机文件锁是必需的,这意味着如果一个程序锁定文件的某个区域,则实际上阻止其他程序以违反该锁的方式访问该区域。在其他系统上,可以基于每个文件配置本机文件锁是建议性的还是必需的。为了确保跨平台的一致和正确的行为,强烈建议使用此API提供的锁,就像它们是咨询锁一样。

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

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