Java创建对象的过程

我们程序员几乎每天都能用到new来创建一个对象。俗话说的好没有疑问的厨子不是个好程序员,那么new对象的过程是怎样的呢?这个对象是如何被创建出来的呢?创建对象单纯的外表之下有没有隐藏着什么不可告人的秘密?答案当然是有,那么废话不多下面开始探究其中的秘密。

1、先画张简单的图来体现一下

Java创建对象简易流程图
Java要创建一个对象简单来说需要上图所述的这几个步骤,下面简单介绍一下:

1.1 类加载检查

JVM在接收到要创建一个对象的指令后会首先检查该类是否已经被加载。这里涉及到几个知识点:Java类加载器(ClassLoader)、类加载过程中的双亲委派机制,(因为我现在在整理以前的笔记我这里先简单介绍,更详细的说明后续的文章会再介绍。)如何检查类是否加载就是通过类加载器的双亲委派机制,自下而上进行询问该类型是否已经加载过,如果加载过就无需再次加载;如果没被加载过,那就自上而下进行询问是否可以加载。

1.2 分配内存

在完成类加载之后,其实这个对象所需内存空间大小就已经知道了,那么JVM就会为该对象在堆上分配内存。这一步主要就是为对象在堆内存中分配一块内存空间。分配内存这里又设计到几个知识点:分配方式:指针碰撞、空闲列表;而采用哪种方式来分配内存主要是看堆内存中可用空间或者说是空闲空间是否规整;而堆内存空间是否规整主要还是看JVM采用了哪种垃圾回收算法,有的算法不具备整理功能那么空闲空间就是零散的,而具备整理功能的算法空闲空间就是规整的。
指针碰撞:针对的是规整的空闲空间,如果空闲内存规整那就采用指针碰撞的方式;这个名词我在理解的时候其实也是挺费事的,这个说的大致意思就是:在空闲空间和已用空间之间有一个指针,当一个对象要划分一块空闲空间时那么就移动该指针到指定大小的位置,类比在我们学生时代使用量杯往杯里倒水的过程这样会好理解一点。
空闲列表:针对的是不规整的空闲空间,如果空闲空间是不规整的也就是和已用空间是混在一起的就要用空闲列表的方式;这个怎么理解呢?举个不恰当的栗子:就是你找工作入职分配工位的过程,比如你入职一个新公司,那么新公司就要给你分配一个空闲的工位,比如你身材魁梧可能给你分配一个大一点的工位,身材娇小那就分配一个小一点的工位。。。

1.3 初始化0值

这一步其实非常简单,就是为对象的属性附上初始化值,如何理解呢?举个栗子:比如你的对象中有一个int类型的属性那么就赋予初始化值0,如果有一个String类型的属性那就把null赋值给它。

1.4 对象头设置

我们知道Java中对象分为这几块:对象头、实例数据、对齐填充。初始化0值的步骤完成之后,JVM就开始对对象头下手了,对象头其实可以理解为对这个对象的简介信息,这个步骤就是设置对象头的这些属性信息,对象头里会存放对象的Hash码、指针类型(其实说白了就是该对象是哪个类的实例,通过指针类型去确定这个对象是哪个类的实例)、对象GC分代年龄等信息。其实对齐填充也挺难理解的,这个还涉及到一个前提:HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,也就是说Java对象所占内存大小必须是8bit的整数倍。那么一个对象大小不是8bit的整数倍怎么办,这时候就需要对齐填充了。怎么理解:就像卖家发快递用的纸箱,纸箱大小有规格,你买的东西比较小怎么办,那就给你塞一些那种捏泡泡的那种塑料纸。。。其实这一点还能联想到4k对齐。

执行init方法

执行init方法,可以理解为按照你写的代码的样子去初始化这个对象。前面哪些步骤其实是JVM对这一步所做的铺垫,这一步就需要把对象属性的值真正的赋给属性咋说,(就是其实你的对象属性比如:int i = 7,经过上面的步骤int的值是0,现在就是要把7赋值给它。)还有一个就是要执行构造方法。

别看你只是简单的写了一个new,其实其中的操作就是上述这么复杂。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值