У меня было жесткое временное отображение памяти в 550 МБ-файле. Я понимаю, что 32-разрядная JVM может выделить максимальный объем памяти около 1,4 Гб, поэтому мне нужно сопоставить большой файл по частям. Однако это 550 МБ файл, но я все еще не могу отобразить все это в памяти. Лучшее, что я могу сделать, это размер буфера около 333 МБ.32-разрядный максимальный размер памяти JVM на 64-битной Windows не так важен, как ожидалось
Ниже мой тестовый код:
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
Может кто-нибудь объяснить, почему я могу использовать только 300MB из 1,4 ГБ? Благодарю.
Обратите внимание, что это не дублирующий вопрос с теми, кто спрашивает о максимальном размере кучи для 32-разрядной JVM.
Почему вы не можете использовать 64-битную JVM? – immibis
@immibis: Возможно, «потому что IT говорит так» ... –
@immibis Просто создайте новый ПК с Windows 8.1 и проверите пару старых кодов. Java.com обеспечивает 32-разрядную загрузку для Win8 по умолчанию, поэтому я думаю, было бы здорово, если мое приложение сможет поддерживать 32-разрядную JVM. На самом деле, я думаю, что проблема здесь не в том, что 32-разрядная проблема, так как фактическое адресное пространство, которое я получаю, намного меньше прогнозируемых возможностей. – Fenwick