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