Java中的内存布局

Java中的内存布局,java,interface,memory-layout,Java,Interface,Memory Layout,我在高中通过了Java测试。有一个问题困扰了我太多,因为我一片空白,我该如何解决它 考虑以下Java代码: interface Pingable { public void ping(); } class Counter implements Pingable { int count=0; public void ping(){++count;} public int val(){return count;} } public class Ping { public st

我在高中通过了Java测试。有一个问题困扰了我太多,因为我一片空白,我该如何解决它

考虑以下Java代码:

interface Pingable {
  public void ping();
}

class Counter implements Pingable {
  int count=0;
  public void ping(){++count;}
  public int val(){return count;}
}

public class Ping {
  public static void main(string args[])
  {
    Counter c=new Counter();
    c.ping();c.ping();
    int v=c.val();
    System.out.println(v);
  }          
}

假设这将被编译为具有4字节地址的机器上的本机代码。在内存中为计数器对象绘制布局图。显示所有虚拟函数表。

如果您试图在32位操作系统中执行上述代码,并且由于int也占用4字节内存,因此简单计数将消耗单个4字节内存

一些重要的细节,都完全依赖于JVM。这是针对OpenJDK/HotSpot的

  • 64位JVM通常使用4字节地址。Java 8 64位可以寻址高达64 GB的堆
  • 每个对象都有一个头,在32位JVM上为12字节,在64位JVM上为16字节
  • 标头包含对类的引用,该类包含对vtable的引用
  • 当代码预热时,可以内联一些简单的方法,这样就不用vtable了
  • 虽然JVM可以进行转义分析并消除堆上的对象,但它很少这样做,即使是在很小的情况下:(

现在人们在高中学习操作系统?这是一个Java测试?在谈论Java时,这是一个可怕的问题。如果你试图学习语言实现细节,这可能是一个相关的问题,但对于实际的Java知识来说,这是完全没有用的。特别是因为JVM规范中没有提到“内存布局”或“虚拟功能表”",它们是实现细节。同意@JoachimSauer。大多数专家Java开发人员可能无法回答这个问题,因为这与学习Java完全无关。如果你问了“它做什么”之类的问题,那么我会对告诉你运行它并查看的内容投反对票,但我认为你是一个糟糕老师的受害者。告诉你您的老师说您的个人java到本机编译器确实逃避了分析!因此它检测到没有必要实例化
计数器
并将所有内容内联。然后就没有
计数器
对象了,这会困扰您……;)@更糟糕的是,代码不会被预热,因此它可能与实际运行足够长的代码的外观没有任何关系。