5

FileChannel#map是立即分配结果所需的所有内存ByteBuffer,还是仅在从缓冲区读取期间按需分配?

我刚刚尝试在一个简单的测试程序中映射所有 500+ MB 的文件,并查看了进程的内存使用情况。(Runtime#totalMemory在 OS X 活动监视器中同时使用并在 groovysh 进程中观察它。)内存使用量从未超过 30-ish MB。

那么,Java 实现是否可以在本机调用中“隐藏”一些内存使用情况?如果是这样,有没有办法找出 OS X 上有多少?

4

3 回答 3

5

内存使用从来都不是直截了当的。实际使用的缓冲区FileChannel.map不是 Java 堆的一部分。实际上,内存可能与其他进程共享。在触摸页面之前,甚至可能无法从光盘中读取文件。

于 2009-05-08T10:51:22.453 回答
1

是的。它不是堆的一部分。尽管如此,根据操作系统的不同,仍然会保留内存。在 OS X 上,因为它类似于 UNIX,您应该能够使用 top 或 ps 来检查它需要多少内存。

于 2009-05-08T14:37:41.823 回答
1

java.nio.MappedByteBuffer#load 将触发将所有文件内容加载到内存中(否则它是按需的):

此方法尽最大努力确保在返回时 * 此缓冲区的内容驻留在物理内存中。调用此 * 方法可能会导致发生一些页面错误和 I/O 操作。

于 2012-03-18T16:08:31.940 回答