我正在努力从现有的Java代码库中删除所有系统调用.我们在商业提供的闭源JVM中运行我们的应用程序.当JVM通过getRuntime.exec()进行系统调用时,java会调用整个JVM进程分支,从而导致严重的性能命中.我们在Linux平台上运行,但最好尽量保持便携性.
我遇到的问题是通过getRuntime.exec()方法替换我们当前使用的sync()调用.我知道有这个 sync()方法和flush().基于这篇文章,我希望进行同步并刷新所有打开的文件流.
我的问题是我不知道那里有什么文件流和描述符.我认为解决这个问题的方法是检查/ proc /(jvm进程号)/ fd文件夹,但我找不到使用纯java可靠地获取JVM进程号的好方法.我以为我可以获得某个类的所有对象(FileDescriptor类)但是从我正在阅读的内容中也是不可行的.
有没有人有关于如何在纯java中复制*nix sync()调用的建议?
您所做的不仅仅是打电话sync。您正在尝试执行“刷新所有文件缓冲区和sync”操作。在 C / C++ 中执行此操作也会遇到麻烦。
除了查找所有打开的文件的问题(您可能可以解决...)之外,还有一个更大的问题;即是否是刷新缓冲区的正确时间。
让我们假设您的应用程序是多线程的,并且一个线程负责调用sync. 该线程如何知道正在写入文件的其他线程已达到文件的一致点?即,如果应用程序被终止并重新启动,(假设)刷新的文件将包含应用程序的逻辑一致状态?答案是(很可能)它不知道。所以......事实上......如果应用程序在同步之前刷新,它并不会处于明显更好的位置。
还有一个问题。假设线程 A 负责刷新/同步,而线程 B 正在愉快地写入某个输出流。考虑这个时间序列:
避免这种情况的唯一方法是让线程 A 同步并阻止正在写入文件的所有其他线程...在执行刷新和同步之前。
我的建议是只进行同步,而忘记刷新。以经典方式处理不一致文件的问题(通过让应用程序写入临时文件,并进行原子重命名),或者让同步线程与写入文件的线程协调......以便它仅当关键文件一致时才“同步”。
| 归档时间: |
|
| 查看次数: |
407 次 |
| 最近记录: |