没有系统调用的* * nix sync()的Java实现
我正在努力从现有的Java代码库中删除所有系统调用.我们在商业提供的闭源JVM中运行我们的应用程序.当JVM通过getRuntime.exec()进行系统调用时,java会调用整个JVM进程分支,从而导致严重的性能命中.我们在Linux平台上运行,但最好尽量保持便携性. 我遇到的问题是通过getRuntime.exec()方法替换我们当前使用的sync()调用.我知道有this sync()方法和flush().并且基于this post我希望进行同步并刷新所有打开的文件流. 我的问题是我不知道那里有什么文件流和描述符.我认为解决这个问题的方法是检查/ proc /(jvm进程号)/ fd文件夹,但我找不到使用纯java可靠地获取JVM进程号的好方法.我以为我可以获得某个类的所有对象(FileDescriptor类)但是从我正在阅读的内容中也是不可行的. 有没有人有关于如何在纯java中复制* nix sync()调用的建议? 最佳答案
您正在做的更多是同步调用.您正在尝试执行“刷新所有文件缓冲区和同步”操作.你也不会在C/C++中这样做.
除了找到所有打开的文件(你可能会解决……)的问题之外,还有一个更大的问题;即是否是冲洗缓冲区的正确时间. 让我们假设您的应用程序是多线程的,并且一个线程负责调用同步.该线程如何知道正在编写文件的其他线程已达到文件的一致点;即如果应用程序被杀死并重新启动,那么(假设)刷新的文件将包含应用程序的逻辑一致状态?答案是(很可能)它不知道.所以……事实上……如果应用程序在同步之前刷新,则应用程序的位置不会明显更好. 还有另一个问题.假设线程A负责刷新/同步,并且线程B正在愉快地写入某个输出流.考虑这个时间顺序: >线程A刷新文件 避免这种情况的唯一方法是让线程A同步并阻止正在写入文件的所有其他线程……在执行刷新和同步之前. 我的建议是只进行同步,忘记冲洗.以经典方式处理不一致文件的问题(通过让应用程序写入临时文件,并进行原子重命名),或者让同步线程与写入文件的线程协调…以便它只有关键文件一致时才“同步”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- spring mvc使用@InitBinder标签对表单数据绑定的方法
- Hibernate Query接口 setMaxResults方法:设置最大返回记录
- 当相对URI包含空路径时,Java的URI.resolve与RFC 3986不兼容
- java – 如何使用ScheduledExecutorService重新安排任务?
- 在R中没有NA强制将字符转换为数字
- 当定时器中安排了Java TimerTask时,是否已经执行了?
- Java servlet 使用 PrintWriter 时的编码与乱码的示例代码
- java – 在处理信息检索中面向行和面向列的数据库之间的区别
- Java 条件语句 if else
- java – 在显示之前获取JPopupMenu大小