jvmjava对象创建的流程步骤(代码片段)

征途黯然. 征途黯然.     2022-12-11     799

关键词:

· 本文摘要
· 罗列Java创建对象的各种方式;
· 讲解Java对象创建的流程步骤;

一、Java创建对象的各种方式

    · 1. 用关键字new,老少皆知的方法:StringBuffer sb = new StringBuffer();

    · 2. 在单例模式(一种设计模式)中创建对象,本质上也是用关键字new,见下面的代码示例:

/**
 * 单例模式
 * 饿汉式(静态常量)
 */
public class BaseConfig 

    private final static BaseConfig INSTANCE = new BaseConfig();

    private BaseConfig () //私有构造子

    public static BaseConfig getInstance() //在这里返回对象,其实也用了new
        return INSTANCE;
    

    · 3. 在工厂模式Factory、建造者模式Builder(也是设计模式)中创建对象,本质上也是用关键字new

    · 4. 反射机制,利用Class.newInstance()。值得注意的是,Class.newInstance()创建对象时的特点有:弱类型,低效率,只能调用无参构造。这里还需要区别Class.forName()Class.forName()返回的是一个类,并不是对象。

    · 5. 利用Constructor.newInstance()Constructor.newInstance()可以调用任意构造函数。

    · 6. 使用克隆clone(),使用前保证对象实现了cloneable()

    · 7. 反序列化。开发中经常会对类实现序列化接口,反序列化支持我们把二进制数据、网络数据转化为Java对象保存在内存中。

    · 8. 使用第三方库Objenesis


二、Java创建对象的步骤

    · 第一步:检测类是否已经加载
    当JVM即将创建对象前,先去检查常量池中是否有此类的符号引用,并且检查此类是否已加载、链接、初始化。如果没有,需要类加载器来加载此类,参考:类加载器基础知识。

    · 第二步:为对象分配内存
    类加载完成以后,虚拟机就开始为对象分配内存,此时所需内存的大小就已经确定了。只需要在堆上分配所需要的内存即可。

    具体的分配内存有两种情况:第一种情况是内存空间绝对规整,第二种情况是内存空间是不连续的。

        · 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump the Pointer)。

        · 空闲列表:如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记 录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例, 并更新列表上的记录,这种分配方式称为“空闲列表”(Free List)。

    · 第三步:处理并发安全问题
    由于对象分配的内存是放在堆中的,堆作为线程共享的数据区,当线程数大于1时,会涉及到线程安全问题。需要通过一定的方式来处理并发安全问题。
    第一种是采用同步的办法,为对象空间加锁,使用CAS来保证操作的原子性。
    另一种是每个线程分配内存都在自己的空间内进行,即是每个线程都在堆中预先分配一小块内存,称为本地线程分配缓冲(TLAB),分配内存的时候再TLAB上分配,互不干扰。

    · 第四步:初始化分配的空间
    内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头), 如果使用TLAB,这一工作过程也可以提前至TLAB分配时进行。这一步操作解释了对象的实例字段在Java代码中为什么可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。

    · 第五步:设置对象头
    分配完内存空间,初始化零值之后,虚拟机还需要对对象进行其他必要的设置,设置的地方都在对象头中,包括这个对象所属的类,类的元数据信息,对象的hashcode,GC分代年龄等信息。

    在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了。但从Java程 序的视角来看,对象创建才刚刚开始<init>方法还没有执行,所有的字段都还为零。

    · 第六步:执行init方法(执行构造器)

java重点知识汇总(包含java基础jvmjava并发)(代码片段)

文章目录一、JAVA重点知识汇总String的不可变性StringBuilder&StringBuffer"=="和equals的区别Object.hashCode()Java的深浅拷贝多态与重载重写几个重要的关键字HashMap内部原理JavaIO和NIO的区别二、JVM重点知识汇总JVM运行时数据区... 查看详情

java重点知识汇总(包含java基础jvmjava并发)(代码片段)

文章目录一、JAVA重点知识汇总String的不可变性StringBuilder&StringBuffer"=="和equals的区别Object.hashCode()Java的深浅拷贝多态与重载重写几个重要的关键字HashMap内部原理JavaIO和NIO的区别二、JVM重点知识汇总JVM运行时数据区... 查看详情

java中反射书写的步骤(代码片段)

目录一、反射创建对象的过程二、反射通过Class创建对象的示例三、反射通过私有构造方法创建对象示例一、反射创建对象的过程1、创建对象的过程图解2、通过上图可知,获得对象实例无论是使用new对象的方式,还是使... 查看详情

java虚拟机对象创建流程初始化流程(代码片段)

前言梳理对象创建流程和初始化流程对象创建流程new指令时,定位该指令的参数在常量池中的符号引用遇到new、getstatic、putstatic、invokestatic这4条字节码指令时,使用java.lang.reflect包的方法对类进行反射调用时。当初始化... 查看详情

jvm--10--创建对象的步骤对象实例化内存布局访问定位(代码片段)

文章目录对象实例化面试题对象创建方式1.new:2.反射3.使用clone()4.使用反序列化5.第三方库Objenesis创建对象的步骤一、判断对象对应的类是否加载、链接、初始化二、为对象分配内存1.如果内存规整:使用指针碰撞如果内... 查看详情

jvm技术专题全流程化分析java对象的创建过程「原理篇」(代码片段)

前言概要对应过程则是:对象创建、对象内存布局、对象访问定位的三个过程。对象的创建过程对象的创建方式java中对象的创建方式有很多种,常见的是通过new关键字和反射这两种方式来创建。除此之外,还有clone、... 查看详情

面向对象程序设计(代码片段)

...感觉是依照运行的步骤去设计执行这个程序。而利用面向对象去设计的时候,设计出的电梯类,产生的电梯对象,每一个方法都是一个特定的功能,一个类型的变量整合在一个类中,方法和函数类似,方法更多的针对对象本身作... 查看详情

设计模式代理模式(动态代理使用流程|创建目标对象|创建被代理对象|创建调用处理程序|动态创建代理对象|动态代理调用)(代码片段)

...弊端二、动态代理的优势三、动态代理使用流程1、目标对象接口2、被代理对象3、调用处理程序4、客户端四、动态生成代理对象类的字节码文件数据前言代理模式结构:代理模式中的元素有客户端,主题对象,被代理对象,代理对象;... 查看详情

工厂模式(代码片段)

...以分为普通工厂模式和抽象工厂模式当碰到需要创建复杂对象的时候,可以使用工厂模式将对象的具体实现封装起来,用户只需要使用提供好的接口即可创建对象。1.普通工厂模式步骤1创建一个接口:publicinterfacecarvoidname();步骤2... 查看详情

面向对象(代码片段)

一:什么是面向对象的程序设计及为什么要有它面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式。优点是:... 查看详情

activiti7体系架构(代码片段)

...架构 通过加载activiti.cfg.xml文件得到ProcessEngineConfiguration对象,通过ProcessEngineConfiguration对象可以得到ProcessEngine对象 得到该对象后,可以通过流程引擎对象ProcessEngine来得到各种Service,每一种Service接口有每个用途 RepositoryService... 查看详情

支付平台架构(代码片段)

...式:子类的某个方法要根据情况来决定用什么类去实例化对象。模板方法模式:用来定义算法的各个步骤,并将某些步骤交由子类实现。流程流程为:下单、用户付款、确认用户付款、发货。下单:客户端调用该接口,上传必要... 查看详情

网络编程tcp网络应用程序开发(代码片段)

...CP客户端程序开发流程的介绍步骤说明:创建客户端套接字对象和服务端套接字建立连接发送数据接收数据关闭客户端套接字3.TCP服务端程序开发流程的介绍步骤说明:创建服务端端套接字对象绑定端口号设置监听等待接受客户端的... 查看详情

jvmjava变量的种类(提高版)(代码片段)

·Java变量按数据类型分,有:①基本数据类型;②引用数据类型;·Java变量按声明位置分,有:①成员变量;②局部变量;见下图:一、按数据类型分1.1、基本数据类型    8种基本数据类型是... 查看详情

建造者模式(代码片段)

...数中调用虚函数时,使用的是静态绑定。2.建造者模式让对象的表示与构建相分离。一、简介建造者模式是当创建复杂对象的流程应该独立与该对象的组成部分以及他们的装配方式时适用的模式。本模式使得同样的构建过程可以... 查看详情

java-05面向对象初级包创建对象(代码片段)

1.基本概念      至于什么是面向对象、为什么面向对象、面向对象到底有什么好处  请移步这里进行了解    1.1面向过程与面向对象的区别与优缺点          面向过程:面向过程就是分析出解决... 查看详情

面向对象定义(代码片段)

...水线或者流程就是用来解决一个问题,基本无法更改面向对象:是一种程序设计思想。将数据和处理数据的程序封装到对象中面向对象的优点:不再需要关心,每个功能具体的实现细节大大提高了程序的扩展性提高了程序的灵活... 查看详情

spring的创建和使用(代码片段)

...en的方式创建Spring项目2)添加Spring依赖3)创建启动类 存Bean对象1.创建Bean对象2.将Bean注册到Spring中取Bean对象并使用步骤1.先得到Spring上下文对象2.从Spring中获取Bean对象3.使用Bean ApplicationContextVSBeanFactory存储Bean对象(更简单)1.前置工... 查看详情