我对MappedByteBuffer有一个问题,特别是它如何在内部工作。我理解它的方式是缓存完全由操作系统完成。因此,如果我从文件中读取(使用MappedByteBuffer),操作系统将从硬盘驱动器读取整个页面并将页面保存在RAM中,以便在需要时再次访问。这还允许为访问同一文件的多个应用程序/进程提供共享缓存。这是对的吗?
如果是这样,如何使此缓存无效?只是重新初始化Mapped-Object应该不起作用。我写了一个从硬盘驱动器中读取很多内容的应用程序。我需要做一些基准测试,所以我需要在需要时清除这个缓存。我试过使用“echo 3> / proc / sys / vm / drop_caches”,但这并没有什么区别所以我认为它不起作用。
答案 0 :(得分:1)
这还允许为访问同一文件的多个应用程序/进程提供共享缓存。这是对的吗?
这是它在Linux,Windows和MacOS上的工作原理。在其他操作系统上,可能是相同的。
如果是这样,如何使此缓存无效?
删除该文件,它将不再有效。
我需要做一些基准测试,所以我需要在需要时清除这个缓存。
这就是操作系统的用途。如果您需要强制缓存无效,这很棘手且完全取决于操作系统。
我尝试使用“echo 3> / proc / sys / vm / drop_caches”,但这并没有什么区别,所以我认为它不起作用。
它可能对您的基准没有影响。我建议您查看/proc/meminfo
Cached: 588104 kB
SwapCached: 264 kB
BTW如果要取消映射MappedByteBuffer,请执行以下操作
public static void clean(ByteBuffer bb) {
if (bb instanceof DirectBuffer) {
Cleaner cl = ((DirectBuffer) bb).cleaner();
if (cl != null)
cl.clean();
}
}
这也适用于直接ByteBuffers,但可能无法在Java 9中使用,因为此接口将被删除。
答案 1 :(得分:0)
它已知的悲惨问题(在JDK中仍未解决):http://bugs.java.com/view_bug.do?bug_id=4724038
但即使没有公共API,也存在危险的解决方法(使用风险自负):https://community.oracle.com/message/9387222
另一种方法是不要使用巨大的MappedByteBuffers,并希望它们最终会被垃圾收集。
如果想要映射此文件的不同程序需要使用他们自己的MappedByteBuffer副本,MapMode.PRIVATE可以提供帮助。
希望有所帮助。