Я запутался с тем сколько в действительности занимает переменная типа byte в java heap, в одном источнике написано что 1 байт, в другом что 4 байта как и int, в третьем источнике написано что он может увеличиваться до 8 байт, в четвертом что он хоть и занимает 4 байта, но при этом к примеру массив из 20 элементов типа byte будет весить 20 байт в оперативке. Так сколько в дейстивительности занимает переменная типа byte в java heap?
Размер объекта в куче зависит от множества факторов - реализации JVM, её разрядности, использования компактных указателей, выравнивания объектов и т.д. и т.п.
Самый простой и быстрый способ посмотреть сколько объект Byte занимает в вашем случае - запустить входящую в JDK утилиту jmap, найти строку java.lang.Byte и разделить значение в колонке bytes на значение в колонке instances
$ jmap -histo <PID>
num #instances #bytes class name (module)
-------------------------------------------------------
...
121: 21 336 java.lang.Byte (java.base@10.0.1)
...
Программный путь чуть сложнее. С ним поможет пакет java.lang.instrument. Для начала нам нужен класс агента:
import java.lang.instrument.Instrumentation;
public class ObjectSizeFetcher {
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}
}
Компилируем
$ javac ObjectSizeFetcher
Потом создаём файл MANIFEST.MF и добавляем в него строку
Premain-Class: ObjectSizeFetcher
А после упаковываем класс и манифест в jar
$ jar cfm ObjectSizeFetcherAgent.jar MANIFEST.MF ObjectSizeFetcher.class
Класс для теста:
public class Main {
public static void main(String[] args) throws Exception {
Byte b = new Byte("1");
System.out.println(ObjectSizeFetcher.getObjectSize(b));
}
}
Компилируем и запускаем c предварительно созданным агентом
$ javac Main.java
$ java -javaagent:ObjectSizeFetcherAgent.jar Main
Код для примера с агентом взят отсюда.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Gradle 47 не запускает юнит тесты пр нажатии на testClasses в InelliJ IDEA: