美文网首页JVM
JVM06 Java中对象的内存是如何布局的?

JVM06 Java中对象的内存是如何布局的?

作者: 夜阑人儿未静 | 来源:发表于2019-01-02 20:11 被阅读10次
    Java中创建对象的方式

    new -通过调用构造器来初始化实例字段
    反射-通过调用构造器来初始化实例字段
    Object.clone-通过直接复制已有的数据,来初始化新建对象的实例字段
    反序列化-通过直接复制已有的数据,来初始化新建对象的实例字段
    Unsafe.allocateInstance-没有初始化对象的实例字段

    Java对象的空间占用

    通过new创建的对象,涵盖了它所有父类中的对象实例的字段
    对象头,由标记字段和类型指针构成
    标记字段,用于存储Java虚拟机有关该对象的运行数据,比如:哈希码、GC信息、锁信息等
    类型指针,用于指向该对象的类
    此对象的实例字段对应的内存空间

    压缩指针

    JVM的内存空间有限且昂贵,为了减少类型指针的内存占用,将64位指针压缩至32位,进而节约内存。之前64位寻址,寻的是字节。现在32位寻址,寻的是变量。再加上内存对齐(补齐为8的倍数),可以每次寻变量都以一定的规则寻找,并且一定可以找得到。

    内存对齐

    内存对齐的另一个好处是,使得CPU缓存行可以更好的实施。保证每个变量都只出现在一条缓存行中,不会出现跨行缓存。提高程序的执行效率。

    字段重排

    其实就是更好的执行内存对齐标准,会调整字段在内存中的分布,达到方便寻址和节省空间的目的。

    @Contented注解

    该注解就是用来解决虚共享问题的,被该注解标识的变量,会独占一个CPU缓存行。但也因此浪费了大量的内存空间。

    相关文章

      网友评论

        本文标题:JVM06 Java中对象的内存是如何布局的?

        本文链接:https://www.haomeiwen.com/subject/mjetrqtx.html