1

我一直在艰难地映射一个 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 的最大堆大小的问题重复的问题。

4

1 回答 1

2

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

于 2014-11-09T01:20:47.983 回答