Максимальный объем памяти для 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 МБ доступно непрерывного адресного пространства. Если вам необходимо отобразить в памяти большие файлы, вы должны иметь возможность отображать их по сегментам, если это становится необходимым.