0

我在高中时通过了 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 字节地址的机器上编译为本机代码。为计数器对象在内存中绘制布局图。显示所有虚函数表。

4

2 回答 2

1

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

  • 64 位 JVM 通常使用 4 字节地址。Java 8 64 位可以寻址高达 64 GB 的堆。
  • 每个对象都有一个标头,在 32 位 JVM 上为 12 个字节,在 64 位 JVM 上为 16 个字节。
  • 标头包含对包含对 vtable 的引用的类的引用。
  • 当代码预热时,可以内联简单的方法,因此不使用 vtable。
  • 虽然 JVM 可以进行逃逸分析并消除堆上的对象,但它很少这样做,即使在微不足道的情况下也是如此 :(
于 2013-11-13T12:38:08.243 回答
0

对于以下上述代码,如果您尝试在 32 位操作系统中执行它,并且由于 int 也占用 4 字节内存,因此只需 count 将消耗单个 4 字节内存。

于 2013-11-13T12:19:48.960 回答