【问题标题】:Java object layout and static fieldsJava 对象布局和静态字段
【发布时间】:2015-07-12 20:04:53
【问题描述】:

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在内存中的什么位置?

【问题讨论】:

  • i 显然没有存储在对象实例中(这就是static 的意思)。它的确切放置位置取决于 JVM。 (我不知道更多细节,因此我评论而不是回答。)
  • 是的,问题是静态变量在哪里=)

标签: java java-memory-model object-layout jol


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多