问题:请讲下在java程序运行时一个对象实例的数据结构是什么样子的
分析:该问题主要考察对java中对象的理解,在程序运行过程中一个对象实例是以什么样的形式存在的
回答要点:
主要从以下几点去考虑,
1、对象实例存储在什么位置
2、程序运行时一个对象实例的数据结构是什么样子的
都知道在java中万事万物都是对象,例如,
public class User{ private String name; private int age; private String address; //年龄加1 public int incrAge(){ return ++age; } //更新住址,并返回老住址 public String modifyAddress(String newAddress){ this.address=newAddress; return this.address; } }
上面是一个User类,有三个属性和两个方法,那么在执行了下面的代码,
User user=new User();
之后,在内存中会发生什么变化。
user肯定要在栈中分配内存,因为它仅仅是一个引用,在java的hotspot虚拟机中一个引用栈4个字节;
user指向的User对象在堆中分配了内存,会形成一个User的实例,这个实例长什么样子,
包含对象头、实例数据、填充区三部分;
对象头
对象头分为两部分,mark word和klass。
mark word中包含了hashcode、GC分代年龄(默认为15)、锁状态标识位、保存持有偏向锁的线程ID、偏向时间戳等。mark word中保存的信息和synchronized有很大的关系,
klass中保存了指向方法区中该类的元信息,表明该实例是哪个类的对象。
实例数据
在实例数据中存储的是该对象中的属性,以上面的User对象为例,存储的是name、age、address三个属性。由于java中的数据类型有基本类型和引用类型,在实例对象中的属性如果是基本类型那么存储的便是其值,如果属性是引用类型那么存储的是一个地址。如果该类显示的指定了父类或者接口,那么根据可见性还会有父类或接口的属性信息。
这里有个疑问在类中有属性和方法,属性存在于实例中也就是在内存中的堆中,那么类中的方法那?方法存储在方法区,在方法区中会有该类的方法信息。
填充区
填充区可有可无。在hotspot虚拟机中要求给对象实例分配内存时,内存的起始地址必须是8的整数倍,也就是对象所占用的内存大小必须是8的整数倍,在对象头的大小肯定是8的整数倍,实例数据有可能不是8的整数倍,这时候填充区便会进行补充直到8的整数倍为止。
有不当之处,欢迎指正,谢谢