【发布时间】:2026-01-13 06:55:02
【问题描述】:
我在内存映射 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 的最大堆大小的问题重复的问题。
【问题讨论】:
-
为什么不能使用 64 位 JVM?
-
@immibis:可能“因为 IT 这么说”...
-
@immibis 刚刚设置了一台新的 Windows 8.1 PC 并测试了一些旧代码。 Java.com 默认为 Win8 提供 32 位下载,所以我认为如果我的应用程序可以支持 32 位 JVM,那就太好了。实际上,我认为这里的问题实际上并不在于 32 位,因为我得到的实际地址空间远小于预测的能力。
标签: java jvm memory-mapped-files mappedbytebuffer