美文网首页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中对象的内存是如何布局的?

    Java中创建对象的方式 new -通过调用构造器来初始化实例字段反射-通过调用构造器来初始化实例字段Object...

  • java 内存布局

    Java 内存的布局主要是统计Java对象占用内存的大小。 Java对象的内存布局:对象头(Header)、实例数...

  • 玩转JVM中的对象及引用②:对象的内存布局及访问

    一、对象的内存布局 问:在 Java 对象创建后,到底是如何被存储在Java内存里的呢? 答:在Java虚拟机(H...

  • Java对象

    Java对象的内存布局?对象的访问?new对象的过程? 一、Java对象的内存布局 对象的创建过程就是在堆上分配实...

  • Java对象内存布局之谜

    Java对象内存布局之谜 一个Java对象在堆上除了成员信息,还有其他内容吗?他在堆上是如何布局的?接下来本文将以...

  • Java对象

    本文以HotSpot虚拟机为例,介绍Java对象在虚拟机中存储和使用方式。 对象的内存布局 对象在内存中存储布局可...

  • JVM(八):Java 对象模型

    JVM(八):Java 对象模型 本文将学习对象是如何创建的,对象的内存布局,以及如何定位访问一个对象。 对象创建...

  • 对Java对象的深入认识(三)

    1. Java对象 1.1 Java对象的组成 ​ 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3...

  • JVM对Synchronized关键字的优化

    Java对象头和Monitor是实现synchronized关键字的基础。 对象头 对象头在内存中的布局: 对象头...

  • Java中对象的内存布局

    所谓内存布局,指的是一个对象在内存中的组成。通常由三部分组成 对象头(包含MarkWord、Klass Point...

网友评论

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

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