Java中的内存布局
我在高中通过了Java测试。有一个问题困扰了我太多,因为我一片空白,我该如何解决它 考虑以下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
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可以进行转义分析并消除堆上的对象,但它很少这样做,即使是在很小的情况下:(
计数器
并将所有内容内联。然后就没有计数器
对象了,这会困扰您……;)@更糟糕的是,代码不会被预热,因此它可能与实际运行足够长的代码的外观没有任何关系。