64位Windows上的32位JVM最大内存大小不如预期的那么大

时间:2014-11-09 01:18:23

标签: java jvm memory-mapped-files mappedbytebuffer

我一直在困难时间内存映射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的最大堆大小的问题,这不是一个重复的问题。

1 个答案:

答案 0 :(得分:3)

最有可能的是,您的地址空间是碎片化的,并且连续地址空间的可用空间不超过550MB。如果需要内存映射大文件,则需要能够在必要时将它们映射到段中。