【问题标题】:Java explain how objects are stored in memory [closed]Java解释对象如何存储在内存中[关闭]
【发布时间】:2021-12-04 11:40:33
【问题描述】:
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 的内容?

【问题讨论】:

  • 你怎么知道xlunaCat 对象的地址(这些数字在我看来不太正确)?无论如何,Java aren't really useful 中的实际内存地址。或者您是在针对这些假设提出理论问题?
  • @Sweeper 他们是,如果你使用 Unsafe 并且需要通过偏移量访问一个对象;但我同意,这听起来纯粹是理论上的。为此,有jol
  • @Eugene Whats jol?是的,这是理论上的课堂讨论
  • 名称是字符串

标签: java object memory


【解决方案1】:

对象作为带有对象头的字段块存储在内存中。您可以查看jol 以了解对象在内存中的实际布局方式。每个对象都有标题,字段可能有填充,字段可能占用比您想象的更多的空间 (boolean),等等。

您可以查看this 示例,我试图在其中解释更多内容,但关于 jol 的 github 页面在其示例中非常广泛。

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

mov    0x10(%rsi),%r10

这是在某个16 偏移量处访问“某物”(0x10 是这里的偏移量)。将对象想象为堆栈,访问字段 - 您需要知道每个对象有多大(VM 跟踪)以及堆栈的起始地址,其余的很容易。

如果您真的想了解从this page 开始的内容,请务必阅读此处。

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多