看来,java 8改变了锁文件的处理方式,这使我积累了大量的.lck文件。
我想通过在我的应用程序中添加一些代码来解决这个问题,以便每次运行时清理输出目录中的锁文件。然而,Java并没有打开这个文件,这意味着如果我打开我的应用程序的第二个实例(普通用例),那么这将导致它删除锁文件,并在试图重复使用与另一个实例相同的日志文件时立即挂起。
有没有人以一种更优雅的方式减轻这一点?
至少在8u25中确认了这是一个bug。坏行为在神谕8u40JRE中消失。
发布于 2015-02-25 03:10:13
这是在Java8中的java.util.logging.FileHandler坏了吗?中讨论的。将JDK 8更新为包含更新40或更高版本的修正JDK-8048020。
当FileHandler打开时,您应该会看到锁文件。如果在VM退出后看到它们徘徊,那么这是因为FileHandler没有关闭,在处理程序关闭钩子运行时VM被暂停或崩溃,或者在尝试删除它们时发生I/O异常。
当涉及到FileHandler使用的FileHandler的实现时,您正在运行的平台也扮演了一个角色。FileLock文档附带以下警告:
是否锁定实际上阻止另一个程序访问锁定区域的内容是系统依赖的,因此没有指定。一些系统的本机文件锁定工具仅仅是建议性的,这意味着程序必须合作遵守已知的锁定协议,以确保数据的完整性。在其他系统上,本机文件锁是强制性的,这意味着如果一个程序锁定文件的某个区域,那么其他程序实际上无法以违反该锁的方式访问该区域。在其他系统上,无论本机文件锁是建议锁还是强制锁,都可以根据每个文件进行配置。为了确保跨平台的一致和正确的行为,强烈建议将此API提供的锁当作顾问锁一样使用。
这意味着FileHandler可以在不同的平台上具有不同的锁定行为。
与锁文件相关的还有日志记录器的垃圾收集,它不会关闭附加的处理程序。这些问题在JDK-8060132:处理程序中讨论过,这些处理程序配置在logging.properties中的抽象节点上,并不总是正确关闭,而且JDK-6274920: JDK记录器对java.util.logging.Logger实例有很强的引用。
https://stackoverflow.com/questions/28708247
复制相似问题