我一直在困难时间内存映射550MB文件。据我所知,32位JVM可以分配大约1.4G的最大内存大小,所以我需要按部分映射一个大文件。但是,这是一个550MB的文件,但我仍然无法将其全部映射到内存中。我能做的最好的是大约333MB的缓冲区大小。
以下是我的测试代码:
void testMap() throws IOException{
long buffer = 500000000; // CAUSES ERROR. best I can do is 350000000
RandomAccessFile srcFile = new RandomAccessFile("550MBFile", "r");
ByteBuffer srcbb = srcFile.getChannel().map(MapMode.READ_ONLY, 0, buffer);
}
错误如下:
Exception in thread "main" java.io.IOException: Map failed
at sun.nio.ch.FileChannelImpl.map(Unknown Source)
at TestSpliter.testMap(TestSpliter.java:22)
at TestSpliter.main(TestSpliter.java:14)
Caused by: java.lang.OutOfMemoryError: Map failed
...
JVM参数:-Xms1024m
任何人都可以解释为什么我只能在1.4GB中使用300MB?谢谢。
请注意,对于那些询问32位JVM的最大堆大小的问题,这不是一个重复的问题。
答案 0 :(得分:3)
最有可能的是,您的地址空间是碎片化的,并且连续地址空间的可用空间不超过550MB。如果需要内存映射大文件,则需要能够在必要时将它们映射到段中。