Почему инструменты VisualVm и JOL дают разные результаты для размера объекта

Я попытался измерить размер одного экземпляра класса A:

package pkg;
class A {
    private int i;
}

Результат с использованием VisualVm составил 20 байт:

Но результат с использованием JOL составил 16 байт:

pkg.A object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0    12        (object header)                           N/A
     12     4    int A.i                                       N/A
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

Вот полный код, который я использовал для этого теста:

package pkg;

import org.openjdk.jol.info.ClassLayout;

import static java.lang.System.out;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        A a = new A();
        out.println(ClassLayout.parseClass(A.class).toPrintable());
    }
}

class A {
    private int i;
}

Я неправильно использовал этот инструмент или неверно истолковал его результаты? Я ожидал получить одинаковые результаты от обоих инструментов.

2 ответа

Решение

Тебе это не понравится, наверное... Но VisualVM ложь, как в значительной степени объясняется здесь (есть еще более подробное видео от того же великого Шипилева, но я не могу его найти)

Доверять JOLЭто правильно показывает вам результат.

Потому что вы используете ClassLayout.parseClass(A.class),

Если вы хотите измерить использование памяти a (экземпляр A), пытаться

ClassLayout.parseInstance(a).toPrintable()
Другие вопросы по тегам