FileChannel #map的内存使用情况

时间:2009-05-08 10:34:46

标签: java memory-management mmap

FileChannel#map是否会立即分配生成的ByteBuffer所需的所有内存,还是仅在从缓冲区读取时按需分配?

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

  

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