FileChannel#map
是立即分配结果所需的所有内存ByteBuffer
,还是仅在从缓冲区读取期间按需分配?
我刚刚尝试在一个简单的测试程序中映射所有 500+ MB 的文件,并查看了进程的内存使用情况。(Runtime#totalMemory
在 OS X 活动监视器中同时使用并在 groovysh 进程中观察它。)内存使用量从未超过 30-ish MB。
那么,Java 实现是否可以在本机调用中“隐藏”一些内存使用情况?如果是这样,有没有办法找出 OS X 上有多少?
FileChannel#map
是立即分配结果所需的所有内存ByteBuffer
,还是仅在从缓冲区读取期间按需分配?
我刚刚尝试在一个简单的测试程序中映射所有 500+ MB 的文件,并查看了进程的内存使用情况。(Runtime#totalMemory
在 OS X 活动监视器中同时使用并在 groovysh 进程中观察它。)内存使用量从未超过 30-ish MB。
那么,Java 实现是否可以在本机调用中“隐藏”一些内存使用情况?如果是这样,有没有办法找出 OS X 上有多少?
内存使用从来都不是直截了当的。实际使用的缓冲区FileChannel.map
不是 Java 堆的一部分。实际上,内存可能与其他进程共享。在触摸页面之前,甚至可能无法从光盘中读取文件。
是的。它不是堆的一部分。尽管如此,根据操作系统的不同,仍然会保留内存。在 OS X 上,因为它类似于 UNIX,您应该能够使用 top 或 ps 来检查它需要多少内存。
java.nio.MappedByteBuffer#load 将触发将所有文件内容加载到内存中(否则它是按需的):
此方法尽最大努力确保在返回时 * 此缓冲区的内容驻留在物理内存中。调用此 * 方法可能会导致发生一些页面错误和 I/O 操作。