Сколько памяти занимает boolean в java
System.out.println("April has " + month_days[3] + " days.");
При запуске эта программа печатает количество дней в апреле, как это показано ниже. Нумерация элементов массива в Java начинается с нуля, так что число дней в апреле — это month_days [3].
April has 30 days.
Имеется возможность автоматически инициализировать массивы способом, во многом напоминающим инициализацию переменных простых типов. Инициализатор массива представляет собой список разделенных запятыми выражений, заключенный в фигурные скобки. Запятые отделяют друг от друга значения элементов массива. При таком способе создания массив будет содержать ровно столько элементов, сколько требуется для хранения значений, указанных в списке инициализации.
public static void main(String args[])
System.out.println("April has " + month_days[3] + " days.");
В результате работы этой программы, вы получите точно такой же результат, как и от ее более длинной предшественницы.
На самом деле, настоящих многомерных массивов в Java не существует. Зато имеются массивы массивов, которые ведут себя подобно многомерным массивам, за исключением нескольких незначительных отличий. Приведенный ниже код создает традиционную матрицу из шестнадцати элементов типа double, каждый из которых инициализируется нулем. Внутренняя реализация этой матрицы — массив массивов double.
double matrix [][] = new double [4][4];
Следующий фрагмент кода инициализирует такое же количество памяти, но память под вторую размерность отводится вручную. Это сделано для того, чтобы наглядно показать, что матрица на самом деле представляет собой вложенные массивы.
double matrix [][] = new double [4][];
matrix [0] = new double[4];
matrix[1] = new double[4];
В следующем примере создается матрица размером 4 на 4 с элементами типа double, причем ее диагональные элементы (те, для которых х==у) заполняются единицами, а все остальные элементы остаются равными нулю.
Для всех примитивных типов данных, кроме типа boolean , в Java однозначно определен размер.
Размер типа boolean , насколько я понимаю, зависит от реализации конкретной виртуальной машины.
Вопрос: почему для типа boolean однозначно не определили размер?
Встречный вопрос. А с какими целями это, по-вашему, может быть надо? Полагаю, что ответ "определять размер однозначно было просто незачем" вас не устроит. Потому что boolean - 1 бит. А адресовать один бит нельзя. А количество бит/байт которые можно адресовать (читай, минимальный размер памяти, который можно прочитать) в теории зависит от реальной машины, на которой исполняется java. Думаю причина в этом.Если поведение однозначно определено, всё остальное вторично.
Тип boolean прекрасно определяется множеством своих допустимых значений. Математически оно ограничивает минимальный размер значения одним битом.
Но использовать именно один бит (и ни битом более) эффективно далеко не всегда, поскольку на популярных архитектурах нельзя адресовать отдельные биты. А потому значения отдельных boolean 'ов нельзя быстро сохранить в отдельные биты оперативной памяти — необходимо использовать комбинацию побитовых операций, что почти наверняка будет медленнее, чем запись целого отдельного регистра в оперативную память (размер которого может быть различным на разных платформах!).
Но при этом, к примеру, я вполне себе представляю, как на x86 компилятор может использовать в нативном коде в качестве какого-нибудь конкретного boolean -значения один бит регистра флагов, при условии, что это значение никогда не попадает в оперативную память (отдельно от других). Поэтому любые ограничения на размер более одного бита тоже могут потенциально мешать.
И эта свобода представления позволяет авторам виртуальных машин Java использовать любые реализации, которые они считают наиболее эффективными в каждом конкретном контексте. Как видно из примеров выше, любые ограничения будут только мешать.
У Вас когда-либо случались такие ситуации, когда Ваше Java приложение трещит по швам? В моём случае это случилось из-за нехватки доступной оперативной памяти. И, естественно, обнаружилась нехватка в самый неподходящий момент: на носу очередной долгожданный релиз, один из серверов остановлен для обновления кода и данных и реинкарнация старого кода уже невозможна, в ближайшие дни запланировано несколько совещаний и собеседований, что сильно отвлекает от процесса оптимизации — в общем, ЧП не прошло незамеченным.
К слову сказать, сделай я правильный backup и экстренные работы по восстановлению жизнеспособности прошли бы гораздо более спокойно, но это была бы уже совсем другая история. Итак в моём распоряжении есть код, которому не хватает 15Gb оперативной памяти для нормального функционирования и очень длительный и дорогостоящий процесс запуска (около 5 часов), в ходе работы которого можно только сидеть со скрещенными пальцами и надеятся, что в этот раз заветные слова OutOfMemoryException не появятся в консоли удалённого сервера.
Не буду описывать всех ухищрений, которые пришлось проделать, чтобы восстановить остановленный сервер в течении трёх дней, но одним своим мини открытием поделюсь — boolean — это не тот тип данных, который Вы хотите использовать в высоконагруженных системах. Внимание вопрос:
Как Вы думаете, сколько памяти занимает boolean например на Ubuntu server x64?
Правильным ответом будет: неизвестно и зависит только от реализации JVM.
Рассмотрим распространённую Sun JVM и прочтем в спецификации виртуальной машины, что boolean типа в ней нет как такового, вместо него используется int! А это означает, что для хранения значения типа «да\нет» используется ровно 32 бита, независимо от архитектуры процессора. Правда в том же разделе мы видим, что произведена оптимизация для работы с массивами boolean, которые преобразуются в массив байт, что даёт прирост доступной памяти в 4 раза. И всё же платить за хранение нолика или еденички семью лишними битами — иногда просто кощунство и издевательство над серверами (особенно при размерах массивов в 500 миллионов элементов).
Спасением в таких случаях будет класс BitSet, который ведёт себя подобно массиву boolean, но упаковывает данные так, что для одного бита выделяется всего один бит памяти (с небольшими издержками для всего массива). BitSet хранит внутри себя массив типа long, а при запросе или установке значения определенного бита — высчитывает индекс нужного long и пользуясь побитовыми операциями и операциями сдвига производит вычисления над единственным битом.
Существует еще более интересная реализация BitSet, OpenBitSet — Apache реализация, которая используется для Lucene. Она гораздо быстрее, но упускает некоторые проверки, проводимые в оригинальном BitSet. Что использовать — решать Вам.
может ли кто-нибудь сказать размер бита boolean в Java?
Это зависит от виртуальной машины.
Это зависит от виртуальной машины, но легко адаптировать код аналогичный вопрос о байтах в Java:
чтобы повторить, это зависит от виртуальной машины, но на моем ноутбуке Windows под управлением Sun JDK build 1.6.0_11 я получил следующие результаты:
это говорит о том, что булевы могут быть в основном упакованы в байт каждый JVM Sun.
фактическая информация, представленная логическим значением в Java, является одним битом: 1 для true, 0 для false. Однако фактический размер булевой переменной в памяти точно не определяется спецификацией Java. Смотрите примитивные типы данных в Java.
логический тип данных имеет только два возможные значения: true и false. Использовать этот тип данных для простых флагов, которые отслеживание истинных / ложных условий. Эта информация тип представляет один бит информация, но его "размер" не что-то, что точно определено.
на боковой ноте.
Если вы думаете об использовании массива булевых объектов, не используйте вместо этого битовый набор - у него есть некоторые оптимизации производительности (и некоторые хорошие дополнительные методы, позволяющие вам получить следующий бит set/unset).
Я читал, что Java резервирует один байт для boolean тип данных, но он использует только один бит. Однако в документации говорится, что " его "размер" - это не то, что точно определено". см. здесь.
The boolean значения компилируются в int тип данных в JVM. Смотрите здесь.
размер логического значения в java зависит от виртуальной машины. но любой объект Java выравнивается до 8 байт детализации. Логическое имеет 8 байт заголовка, плюс 1 байт полезной нагрузки, в общей сложности 9 байт информации. В JVM затем округляется до следующего значения, кратного 8. Итак, один экземпляр java.ленг.Boolean занимает 16 байт памяти.
это неопределенно; делать такие вещи, как предложил Джон Скит, даст вам приближение на данной платформе, но способ точно узнать для конкретной платформы-использовать профилировщик.
В Java есть 8 примитивных типов, которые делят на 4 группы, вот они:
- Целые числа - byte, short, int, long
- Числа с плавающей точкой (иначе вещественные) - float, double
- Логический - boolean
- Символьный - char
Целочисленные типы различаются между собой только диапазонами возможных значений, например, для хранения номера элемента в таблице Менделеева пока хватит переменной типа byte.
Тип | Размер (бит) | Диапазон |
---|---|---|
byte | 8 бит | от -128 до 127 |
short | 16 бит | от -32768 до 32767 |
char | 16 бит | беззнаковое целое число, представляющее собой символ UTF-16 (буквы и цифры) |
int | 32 бит | от -2147483648 до 2147483647 |
long | 64 бит | от -9223372036854775808L до 9223372036854775807L |
Пример использования целочисленных типов:
Символы тоже относят к целочисленным типам из-за особенностей представления в памяти и традиций.
Тип | Размер (бит) | Диапазон |
---|---|---|
float | 32 | от 1.4e-45f до 3.4e+38f |
double | 64 | от 4.9e-324 до 1.7e+308 |
Тип | Размер (бит) | Значение |
---|---|---|
boolean | 8 (в массивах), 32 (не в массивах используется int) | true (истина) или false (ложь) |
В стандартной реализации Sun JVM и Oracle HotSpot JVM тип boolean занимает 4 байта (32 бита), как и тип int. Однако, в определенных версиях JVM имеются реализации, где в массиве boolean каждое значение занимает по 1-му биту.
Ссылочные типы - это все остальные типы: классы, перечисления и интерфейсы, например, объявленные в стандартной библиотеке Java, а также массивы.
Строки это объекты класса String, они очень распространены, поэтому в некоторых случаях обрабатываются отлично от всех остальных объектов. Строковые литералы записываются в двойных кавычках.
Если требуется создать ссылку на один из примитивных типов данных, необходимо использовать соответствующий класс-обертку. Также в таких классах есть некоторые полезные методы и константы, например минимальное значение типа int можно узнать использовав константу Integer.MIN_VALUE. Оборачивание примитива в объект называется упаковкой (boxing), а обратный процесс распаковкой (unboxing).
Тип | Класс-обертка |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
Рекомендуется использовать valueOf, он может быть быстрее и использовать меньше памяти потому что применяет кэширование, а конструктор всегда создает новый объект.
Получить примитив из объекта-обертки можно методом <имя примитивного типа>Value.
Читайте также: