java面试一日一题:java中一个对象实例的结构是什么样子的

问题:请讲下在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的整数倍为止。

 

有不当之处,欢迎指正,谢谢

posted @ 2021-05-20 22:19  良工说技术  阅读(220)  评论(0编辑  收藏  举报