【发布时间】:2014-04-19 11:06:25
【问题描述】:
我遇到了 MappedByteBuffer 的问题,特别是它在内部是如何工作的。我理解它的方式缓存完全由操作系统完成。因此,如果我从文件中读取(使用 MappedByteBuffer),操作系统将从硬盘驱动器读取整个页面并将页面保存在 RAM 中,以便在再次需要时更快地访问。这也允许为访问同一文件的多个应用程序/进程提供共享缓存。这是正确的吗?
如果是这样,如何使这个缓存失效?只是重新初始化映射对象不应该工作。我编写了一个从硬盘驱动器读取大量数据的应用程序。我需要做一些基准测试,所以我需要在需要时清除这个缓存。我尝试使用“echo 3 > /proc/sys/vm/drop_caches”,但这并没有什么不同,所以我认为它不起作用。
【问题讨论】:
-
这取决于操作系统;看来您在这里使用的是 Linux,但您真正应该做的是
.force()并取消映射,然后再次映射。 -
docs.oracle.com/javase/6/docs/api/java/nio/channels/… 说“映射一旦建立,就不会依赖于用于创建它的文件通道。特别是关闭通道对映射的有效性没有影响。”
-
@Karamba 保存到文件的映射后,它会保持打开状态,直到您调用 close() 并且所有映射都已清除。
-
你能告诉我在规范中哪里可以找到这个吗?我只看到以下内容:docs.oracle.com/javase/7/docs/api/java/nio/channels/… - “映射一旦建立,不依赖于用于创建它的文件通道。特别是关闭通道对映射的有效性没有影响。”因此,我看不到关闭 File/FileChannel 如何帮助从 MappedByteBuffer 回收 RAM。
-
正如所写,这似乎是一个“X-Y”问题:你想做 X,并且你认为 Y 是解决它的最佳方法,所以你问如何做 Y。你想要完成的真正的“X”?换句话说,你打算用你的基准来演示/验证/测试什么?
标签: java mappedbytebuffer