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开始的事情,必须阅读这里。
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开始的事情,必须阅读这里。