Java对象内存分布

2021/4/18 7:26:49

本文主要是介绍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引入包装类型的原因之一。


这篇关于Java对象内存分布的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程