Расположение объектов Java и статические поля
Инструмент JOL дает возможность рассчитывать структуру памяти объекта.
Я заметил, что статические поля не участвуют в расчете, например:
public class Foo {
private static final int i = 1;
private char value;
public Foo(char value) {
this.value = value;
}
}
затем,
System.out.println(ClassLayout.parseClass(Foo.class).toPrintable());
дает следующий вывод:
com.kishlaly.Foo object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 2 char Foo.value N/A
14 2 (loss due to the next object alignment)
Instance size: 16 bytes (estimated, the sample instance is not available)
Space losses: 0 bytes internal + 2 bytes external = 2 bytes total
Где находится приватный статический финал int в памяти?
1 ответ
Инструмент дает расположение памяти объекта в куче. Статический контент находится в разделе памяти PermGen и находится в реализации JVM, независимо от того, включен он в кучу или нет.
Ваш инструмент предоставил макет памяти объекта, в то время как статическая переменная является переменной уровня класса, она всегда будет в разделе постоянной генерации памяти и не будет включена в этот макет.