boolean и размер в памяти

99
14 июня 2021, 22:00

Размер (бит) boolean 8 (в массивах), 32 (не в массивах используется int). Вот понимаю что всегда int это 32 бита. А как определить и понять, boolean в массивах и не в массивах?

 boolean[] array = {false, true, false}; //здесь boolean 8 бит (т.к в массиве)?
 boolean person = true; // здесь boolean 32 бита (т.к не в массиве?)

Можно здесь по подробнее, информация взята у https://ru.wikibooks.org/wiki/Java/%D0%A2%D0%B8%D0%BF%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85

Answer 1

Сходил по ссылке, там написана какая-то ересь (как минимум для виртуальной машины HotSpot). Чтобы убедится в этом, возьмём jol и посмотрим самостоятельно размер занимаемой памяти полем типа boolean.

Example.java

class Example {
    boolean x = true;
}

ShowLayout.java

import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.info.GraphLayout;
import org.openjdk.jol.vm.VM;
public class ShowLayout {
    public static void main(String[] args) {
        boolean[] a = {false, true, false};
        // Информация об используемой виртуальной машине
        System.out.println(VM.current().details());
        // Информация о размере поля типа boolean
        System.out.println(ClassLayout.parseClass(A.class).toPrintable());
        // Информация о размере массива
        System.out.println(GraphLayout.parseInstance((Object) a).toPrintable());
        // Информация о структуре массива
        System.out.println(ClassLayout.parseInstance(a).toPrintable());
    }
}

Компилируем

javac -cp jol-cli-0.9-full.jar ShowLayout.java

Запускаем

java -javaagent:jol-cli-0.9-full.jar ShowLayout

Получаем

# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
A object internals:
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0    12           (object header)                           N/A
     12     1   boolean Example.x                                 N/A
     13     3           (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total
[Z@b81eda8d object externals:
          ADDRESS       SIZE TYPE PATH                           VALUE
        76b229190         24 [Z                                  [false, true, false]

[Z object internals:
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           01 a8 ed 81 (00000001 10101000 11101101 10000001) (-2115131391)
      4     4           (object header)                           0b 00 00 00 (00001011 00000000 00000000 00000000) (11)
      8     4           (object header)                           05 00 00 f8 (00000101 00000000 00000000 11111000) (-134217723)
     12     4           (object header)                           03 00 00 00 (00000011 00000000 00000000 00000000) (3)
     16     3   boolean [Z.<elements>                             N/A
     19     5           (loss due to the next object alignment)
Instance size: 24 bytes
Space losses: 0 bytes internal + 5 bytes external = 5 bytes total

По цифре 1 в колонке SIZE напротив Example.x видим, что "не в массивах" boolean имеет размер 1 байт, то есть 8 бит. И по цифре 3 в колонке SIZE напротив boolean [Z.<elements> видимо, что три элемента занимают 3 байта. То есть в обоих случаях boolean имеет размер 8-бит.

READ ALSO
Как при помощи Joda получить 2019-08-22T13:26:36.447019Z

Как при помощи Joda получить 2019-08-22T13:26:36.447019Z

Нужно получить формат времени ввиде: 2019-08-22T13:26:36447019Z, но как это сделать что-то не вкурю

116
Не правильный URI для возврата

Не правильный URI для возврата

Клиент отправляет на сервер картинкуНа сервере в конфиге прописан каталог для сохранения изображения:

80
Необязательные параметры запроса Spring

Необязательные параметры запроса Spring

Моя задача реализовать PATCH метод контроллераРассмотрим два случая:

73