Реальный размер byte в java heap

204
17 мая 2018, 23:40

Я запутался с тем сколько в действительности занимает переменная типа byte в java heap, в одном источнике написано что 1 байт, в другом что 4 байта как и int, в третьем источнике написано что он может увеличиваться до 8 байт, в четвертом что он хоть и занимает 4 байта, но при этом к примеру массив из 20 элементов типа byte будет весить 20 байт в оперативке. Так сколько в дейстивительности занимает переменная типа byte в java heap?

Answer 1

Размер объекта в куче зависит от множества факторов - реализации 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

Код для примера с агентом взят отсюда.

READ ALSO
Gradle. Автозапуск тестов при сборке в IntelliJ IDEA

Gradle. Автозапуск тестов при сборке в IntelliJ IDEA

Gradle 47 не запускает юнит тесты пр нажатии на testClasses в InelliJ IDEA:

171
Jsoup авторизация на сайте с headers

Jsoup авторизация на сайте с headers

Здравствуйте уважаемые форумчане

198