Java 创建对象的方式

1:new 语句和反射机制创建。该方式会调用类的构造器,同时满足诸多约束。如果一个类没有构造器的话,Java 编译器会自动添加一个无参数的构造器。子类的构造器需要调用父类的构造器,如果父类存在无参数构造器的话,该调用可以是隐式的。如果父类没有无参数构造器,那么子类的构造器则需要显式的调用父类带参数的构造器。

显式调用又可以分为两种,一种是使用“super”关键字调用父类构造器,二是用“this”关键字调用同一个类中的其他构造器。无论是直接或者间接的显式调用,都需要作为构造器的第一条语句,以便优先初始化继承而来的父类字段。

2:Object.clone 方法和反序列化通过直接复制已有的数据,来初始化新建对象的实例字段。

在通过调用构造器创建对象的时候,子类的实例会为父类实例字段分配内存。下面总结一下,这些字段在内存中是怎么具体分布的。

压缩指针

在 Java 虚拟机中,每个 Java 对象都有一个对象头,是由标记字段和类型指针所构成。标记字段用来存储 Java 虚拟机有关该对象的运行数据,如哈希码,GC信息以及锁信息;而类型指针则指向该对象的类。

在 64 位的 Java 虚拟机中,对象头的标记字段占 64 位,而类型指针又占了 64 位,总共 16 字节。也就是说,每个 Java 对象在内存的中的额外开销就是 16 个字节。例如:Integer,仅有一个 int 类型的私有字段,占 4 个字节,但是 Integer 的额外开销确实 16 字节。这也是为什么 Java 要引入基本类型的原因之一。

为了减少内存使用量,64 位 Java 虚拟机引入了压缩指针的概念,讲原本 64 位的 Java 对象指针压缩成 32 位的。如此一来,对象头的类型指针也会被要说成 32 位,标记字段并未压缩,使得对象头大小变为 12 字节。

压缩指针的原理: 举例:马路上停了一堆房车,每个房车占据两个车位,总共有 32 个车位,车位排号依次从 0 到 31。我们约定,停在 0 号和 1 号车位上的车是 0 号车,停在 2 号和 3 号车位上的车是 1 号车,以此类推。

原始的内存寻址放的是车位号。比如一个指针的值为 6 ,代表 6 这个车位,找到车位就可以找到 3 号车。采用压缩指针的方式,指针中的值存储的是车号,比如 3 代表的就是 3 号车,然后根据停车规则可以知道在 6 号车位上可以找到 3 号车。

压缩指针就是 JVM 采用封装转化的方法优化了存储结构,自动帮我们实现 32 位的内存地址与 64 位的内存地址的映射。当然,上述情况下对内存数据的查找,需要满足一个前提:数据的存储的起始位置需要对齐字段所占存储空间的整数倍。例如:不开启指针压缩的时候,Java 虚拟机堆中对象的起始地址需要对其至 8 的倍数。如果一个对象用不到 8N 个字节,那么空白的那部分空间就浪费掉了。这些浪费掉的空间我们称之为对象间的填充。

内存字段对其的另一个原因,是让字段只出现在同意 CPU 的缓存中。如果字段不是对齐的,那么就有可能出现跨缓存行的字段。也就是说该字段的读取可能需要替换两个缓存航,而字段的存储也会同时污染两个缓存行。这两种情况对程序的执行效率而言都是不利的。

字段重排列

字段重排列就是 Java 虚拟机重新分配字段的先后顺序,以达到内存对其的目的。Java 虚拟机中有三种排列方法,全都遵循以下两个原则: 1:如果一个字段占据 C 个字节,那么该字段的偏移量需要对其至 NC。这里的偏移量指的是字段地址与对象的起始地址差值。

举例:Long 类,仅有一个 long 类型的实例字段。在 64 为虚拟机中使用压缩指针后,对象头的大小为 12 个字节,该 long 类型字段的偏移量只能是 NC = 2*8 = 16,而中间空着的 4 个字节便会被浪费掉。

2:子类所继承字段的偏移量,需要与父类对应字段的偏移量保持一致。

java反射跨空间调用类_10 Java 对象的内存布局相关推荐

  1. Java 反射将配置文件数据加载到对象属性中

    Java 反射将配置文件数据加载到对象属性中 Java 反射 可以根据类名找到相应的类,也可以将配置文件中的值加载到对应属性中. 需要用到的包:spring-core-3.1.2.Release.ja ...

  2. java反射和注解开发(备java基础,javaee框架原理)-任亮-专题视频课程

    java反射和注解开发(备java基础,javaee框架原理)-5358人已学习 课程介绍         Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明. ...

  3. java对象实例化内存布局与访问定位

    文章目录 1. 对象实例化方式 2. 对象创建的步骤 3. 对象的内存布局 4. 对象的访问定位 1. 对象实例化方式 通过new的方式,例如 Persion p = new Persion() 通过 ...

  4. java对象的内存布局

    java对象内存布局简介 java对象的内存布局包含对象头.实例数据.对齐填充 对象头 markword:对象默认的hash码.分代年龄,锁的状态标识等. class point:指向对象对应的类的元 ...

  5. Java对象创建的过程及对象的内存布局与访问定位

    这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等. 1.对象创建的过程 1.类加载.解析.初始化:虚拟机遇到new时先检查此指令的参数是否能在常量池中找到类的符 ...

  6. java怎么限制一个对象的内存_java对象的内存布局及创建过程

    一.对象的内存布局 对象的内存结构又可以被分为:对象头,实例数据,对象填充 对象头:对象头结构在32位JVM与64位JVM中的实现细节是不同的 32bit: 64bit: 实例数据:对象真正存储的有效 ...

  7. jvm学习笔记(2)——java对象的内存布局

    一.内存布局: 一个java对象在内存中可分为3个区域:对象头(Header).实例数据(Instance Data).对齐填充(Padding). 对象头(两部分): 对象自身运行时的数据.如哈希码 ...

  8. 【Java】Java 如何查看对象的内存布局

    1.概述 在一些博客中说java的内存布局是分为3个部分的,那么我们怎么确认这个呢?或者如何打印java 对象的内存布局呢? 下面介绍可以使用这个类 首先引入这个包 <dependency> ...

  9. java占位符填充_程序员:深入理解Java虚拟机,对象的内存布局

    在 HotSpot 虚拟机中,对象在内存中存储的布局分为 3 块区域:对象头 ( Header ) .实例数据 ( InstanceData ) 和对齐填充 (Padding) . 一.对象的内存布局 ...

  10. 实探java对象的内存布局

    实探java对象的内存布局 在我深入学习synchronized的时候,我查了很多资料,发现synchronized锁住的是对象的对象头,然后我又了解什么是对象头,这块的资料就很多了. 总结一下就是: ...

最新文章

  1. Jfinal Generator 不需要生成带某个前缀的表名数组的方法
  2. 皮一皮:是不是年轻时候的你...
  3. python解析器_Python Python解析器
  4. python自学攻略-你是如何自学 Python 的?
  5. C语言面试题分享(6)
  6. ES6-24 生成器与迭代器的应用
  7. 移动设备web文字单位_移动设备如何塑造现代Web设计
  8. 18.QT-QPlainEdit 信号与槽
  9. Java快速入门学习笔记1 | Eclipse使用
  10. WPS Excel快捷键
  11. 【独行秀才】macOS Monterey 12.0 Beta4(21A5294g)原版镜像
  12. 数据库报错create connection SQLException,............ errorCode 1129, state HY000
  13. android 横屏录制视频,MediaRecorder怎么在竖屏的时候录像结果是横屏录的结果
  14. MSP430通过IAR下载时出现的Failed to load debugee: C:\XX\XXIAR\Release\Exe\Wireless measurement.txt无法下载程序的问题
  15. npoi导出文件不保存在服务器,winform NPOI excel 导出并选择保存文件路径
  16. ZYNQ空间地址详细配置
  17. scrapy爬虫之凤凰网热点新闻
  18. mysql忘记root密码如何重新设置
  19. 点滴:python数据集的文本标签转换成数值
  20. (二)TCP客户端/服务器通信------select函数

热门文章

  1. MSSQL 同步两个数据库的示例
  2. WinXP中自带的netsh命令自动切换IP(zz)
  3. 重构:利用postman检测前后端互相传值
  4. maven依赖和传递
  5. I/O(输入/输出)---字节流与字符流
  6. Swift - EasingAnimation绘制圆环动画
  7. HDU 3622 Bomb Game(2-sat)
  8. Linux-SHELL基本操作
  9. 连载:面向对象葵花宝典:思想、技巧与实践(32) - LSP原则
  10. php选中文本区域,php – 将新行更改为文本区域