Максимальный объем памяти для 32-битной JVM в 64-битной Windows не такой большой, как ожидалось

У меня были проблемы с отображением памяти размером 550 МБ. Я понимаю, что 32-разрядная JVM может выделять максимальный объем памяти около 1,4 ГБ, поэтому мне нужно отобразить большой файл по частям. Тем не менее, это файл 550 МБ, но я все еще не могу отобразить все это в памяти. Лучшее, что я могу сделать, - это размер буфера около 333 МБ.

Ниже мой тестовый код:

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

Кто-нибудь может объяснить, почему я могу использовать только 300 МБ из 1,4 ГБ? Благодарю.

Обратите внимание, что это не дублирующий вопрос с теми, которые задают вопрос о максимальном размере кучи для 32-битной JVM.

1 ответ

Решение

Скорее всего, ваше адресное пространство фрагментировано, и не более 550 МБ доступно непрерывного адресного пространства. Если вам необходимо отобразить в памяти большие файлы, вы должны иметь возможность отображать их по сегментам, если это становится необходимым.

Другие вопросы по тегам