Java FileChannel#映射的内存使用情况

Java FileChannel#映射的内存使用情况,java,memory-management,mmap,Java,Memory Management,Mmap,是否立即分配生成的ByteBuffer所需的所有内存,还是仅在从缓冲区读取时按需分配 我只是尝试在一个简单的测试程序中映射所有500+MB的文件,并查看了该过程的内存使用情况。(使用运行时#totalMemory并在OS X活动监视器中查看groovysh进程)内存使用量从未超过30 MB 那么,Java实现能否在本机调用中“隐藏”一些内存使用?如果是这样的话,有没有办法知道OSX上有多少内存?内存使用从来都不是那么简单的。FileChannel.map使用的实际缓冲区不是Java堆的一部分。实

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

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


那么,Java实现能否在本机调用中“隐藏”一些内存使用?如果是这样的话,有没有办法知道OSX上有多少内存?

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

是。它不是堆的一部分。不过,根据操作系统的不同,仍将保留内存。在OSX上,因为它是UNIX,所以您应该能够使用top或ps来检查它需要多少内存

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

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


对此我不太确定,在某些操作系统(WinXP-32)上,java堆似乎消耗了一些缓冲区。我做了一个测试,消耗大量java堆限制了我可以创建的固定(最大)大小的nio MemoryMappedBuffer的数量。@Justin我不确定这是如何工作的。显然,
Buffer
对象本身就在Java堆中,还有其他与文件映射相关的小对象,可能还有一些临时对象。你有一个简短的测试或数字吗?不是专门用来确定数字的——这是另一个测试的一个侧面观察,它显然完全依赖于JVM。尝试创建一个大(4g)文件,并将其映射到(1024*1024*64B)段中。段的数量似乎取决于JVM中的其他对象使用了多少JVM堆,而不一定取决于有多少可用。@Justin JVM堆的总大小将影响您在32位系统上映射的数量,这仅仅是因为虚拟地址空间耗尽。