Почему инструменты 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()