MappedByteBuffer清除缓存的Pages

时间:2014-04-19 11:06:26

标签: java mappedbytebuffer

我对MappedByteBuffer有一个问题,特别是它如何在内部工作。我理解它的方式是缓存完全由操作系统完成。因此,如果我从文件中读取(使用MappedByteBuffer),操作系统将从硬盘驱动器读取整个页面并将页面保存在RAM中,以便在需要时再次访问。这还允许为访问同一文件的多个应用程序/进程提供共享缓存。这是对的吗?

如果是这样,如何使此缓存无效?只是重新初始化Mapped-Object应该不起作用。我写了一个从硬盘驱动器中读取很多内容的应用程序。我需要做一些基准测试,所以我需要在需要时清除这个缓存。我试过使用“echo 3> / proc / sys / vm / drop_caches”,但这并没有什么区别所以我认为它不起作用。

2 个答案:

答案 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可以提供帮助。

希望有所帮助。