Java对象内存分布

【deerhang】

  • 创建对象的四种方式:new关键字、反射、Object.clone()、unsafe方法
    • new和反射是通过调用构造器创建对象的,创建对象的时候使用invokespecial指令
    • 构造器的限制:如果一个类没有定义构造器的话,Java编译器会为该类生成一个无参构造器。子类需要调用父类的构造器,如果父类存在无参构造器,那么这个调用是隐式的,否则就需要显示的调用父类的构造器。(PS:为什么子类创建需要显示调用父类构造器呢?因为子类需要继承父类的成员变量,这些成员变量需要被父类提前创建好)
    • 当我们调用一个构造器的时候,Java会优先调用它的父类构造器,直到Object类。也就是说我们通过new指令创建出来的对象,会涵盖父类的所有对象,子类的实例话会为父类非配实例化内存。
  • 在Java虚拟机中,每个对象都有一个对象头信息,头信息由标记字段和类型指针组成
    • 标记字段:用来存放对象的运行数据,如哈希码、GC信息、所信息
    • 类型指针:指向对象的类
  • 在64位的Java虚拟机中,每个对象头的标记字段占64位,每个对象头的标记指针也占用64位。一个对象的对象头开销就会占用16个字节。以int和包装类型Integer为例说明,每个int占用空间4个字节,而Integer的空间占用额外消耗就是4倍。这个是Java引入包装类型的原因之一。
posted @ 2021-04-17 19:21  鹿小虎  阅读(112)  评论(0)    收藏  举报