Java中的内存布局

时间:2013-11-13 11:49:57

标签: 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 static void main(string args[])
  {
    Counter c=new Counter();
    c.ping();c.ping();
    int v=c.val();
    System.out.println(v);
  }          
}

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

对于以下代码,如果您尝试在32位操作系统中执行它,并且int也使用4字节内存,那么简单计数将消耗单个4字节内存。