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