Java 解释对象是如何存储在内存中的

Java explain how objects are stored in memory

int x = 5                               Cat luna = new Cat()
Address           Value                 address       reference
669cf9            5                     723ecf        683ec5

如果猫:

public class Cat{
  private String name;

  public void talk(){
      System.out.println("meow");
  }
}

如何显示内存地址 683ec5 中的内容?

Objects 以 Object headers 的字段块形式存储在内存中。您可以查看 jol 以了解 Object 在内存中的实际布局。每个 object 都有 header,字段可能有填充,字段可能需要比您想象的更多 space (boolean),等等

您可以看一下 this 示例,我在其中尝试解释得更多一些,但是关于 jol 的 github 页面包含大量示例。

bytecode 级别访问 Object 字段很无聊,老实说,但是您可以确定地查看 javac 生成的内容(使用 javap).当代码在 CPU 上执行时,您会在尝试获取某个字段时看到不同的偏移量,例如:

mov    0x10(%rsi),%r10

这是在某个 16 偏移量处访问“某物”(0x10 是此处的偏移量)。把 Object 想象成一个堆栈,访问字段 - 你需要知道每个字段有多大(VM 跟踪它)和堆栈的起始地址,剩下的就很简单了。

如果你真的想知道从this page开始的事情,必须阅读这里。