Использование java.util.BitSet, который будет упаковать биты в одной восьмой части пространства по сравнению с использованием boolean
массива.
Причина, по которой логические элементы массива принимают 1 байт вместо 1 бит, потому что (большинство) архитектуры ЦП не обеспечивают возможность прямого чтения и записи отдельных бит памяти. Меньшие единицы ПК могут работать с 8 битами. JVM может упаковать бит вместе, а затем изменить бит, он будет считывать байт, изменять его и записывать обратно, но это не работает, если несколько потоков одновременно изменяют массив.
Что касается вашего исходного массива, это 1 миллиард булевых, по одному байту, что составляет 1 миллиард байт или ~ 954 МБ. Итак, куча 1024 МБ должна быть достаточной (?). Возможно, он не может найти достаточно большой объем памяти или, возможно, вы не задали параметр памяти правильно. Распечатайте значение Runtime.getRuntime().maxMemory()
, чтобы узнать максимальный размер кучи, который использует Java. Для 1024 МБ параметр должен быть -Xmx1024M
.
Заключительное примечание. На языке Java 7 вы можете использовать символы подчеркивания в цифрах, чтобы сделать их более читаемыми. Поэтому вы можете написать 1_000_000_000
вместо 1000000000
.
Вам действительно нужно такое пространство? – Reddy
Подсчитайте сначала: размер * 4 байта плюс другие объекты. Используйте [Буфер] (http://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html) вместо –
@ajozwik Откуда у вас размер * 4 байта? – Kayaman