3

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

private static final int在内存中的什么位置?

4

1 回答 1

3

该工具给出了堆上对象的内存布局。静态内容位于内存的 PermGen 部分中,并且无论是否包含在堆中,它都位于 JVM 实现中。

您的工具提供了对象的内存布局,而静态变量是类级变量,它将始终位于内存的永久生成部分中,并且不会包含在此布局中。

于 2015-05-03T17:36:40.497 回答