代码之家  ›  专栏  ›  技术社区  ›  Sparkfizt

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

  •  1
  • Sparkfizt  · 技术社区  · 9 年前

    看起来java8对如何处理锁文件进行了更改,这导致我积累了大量.lck文件。

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

    有人以更优雅的方式减轻了这一点吗?


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

    1 回复  |  直到 9 年前
        1
  •  2
  •   Community dbr    7 年前

    这包括在 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异常。

    您正在运行的平台在实现 FileLock 由FileHandler使用。FileLock文档附带以下警告:

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

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

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