STEP1:类加载检查

虚拟机遇到一条 new 指令的时候,首先去常量池中检查该对象的符号引用,并检查该引用是否被加载过、初始化过、解析过。如果没有,就要去执行类加载过程。

STEP2:分配内存

在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定。分配方式有两种:”指针碰撞”和“空闲列表”两种,选择那种分配方式由Java 堆是否规整决定,而 Java 堆是否规整又由所采用的垃圾收集是否带有压缩整理功能所决定。

指针碰撞:

适用场合:堆内存规整(没有内存碎片)的情况(复制算法,标记压缩算法)

原理:用过的内存全部整合到一边,其中用一个指针来分隔,来了一个新对象,指针往没有用过内存的地方移动。

GC 收集器:serial(标记压缩),parallel(serial 的多线程版本)

空闲列表

使用场合:堆内存不规整,有内存碎片(标记清楚算法)

原理:虚拟机会维护一个列表,该列表中会记录那些内存块是可用的,在分配的是偶,找一块足够大的内存块来创建对象实例,然后更新列表。

内存分配并发问题

在创建对象中,我们肯定不能允许另外的线程来干扰,就比如你女票被男的骚扰了,你爽吗?所以我们虚拟机在创建对象的时候要保证线程安全。通常也有两种方式来保证创建对象    是线程安全的:

CAS+失败重试:

CAS 是乐观锁的一种实现。乐观锁是指,它每次都假设没有其他线程来干扰的,如果有线程干扰,那就重新创建,直到创建成功。这样可以保证更新操作的原子性。

TLAB:

为每一个线程预先在 Eden 区域分配一块内存,首先 TLAB 分配,对象的需要的内存大于了 TLAB 提供的,再采用 CAS 进行内存分配。

STEP3:初始化零值

当内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这    一步操作保证了对象的实例字段在 Java 代码中可以不赋初值就直接使用,程序能访问到这些字段的数据类型所对应的零值。就跟有些成员变量你赋值了,有些没有赋值,那么那    些没有赋值的就是 Null 的道理是一样的。

STEP4:设置对象头

初始化完成后,我们需要一个东西去辨认我们这个新创建对象的一些信息。很多事物的基本信息都存在什么头,比如 http,它的大概属性都会存在信息头中,比如请求方式之类的。当然我们这个新创建对象也是一样的,我们就用对象头来存储对象是那个类的实例、类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。

STEP5:执行 init 方法

经过上面 4 步操作后,我们从虚拟机的角度来看,一个新的对象已经产生了,但从 Java 程序中,对象创建好了,我们都一般还有构造函数去初始化值,所以<init>方法就起作用    了,把对象按照程序员的意愿来进行初始化,这样 5 步才算把一个真正可用的对象完全产生出来。

更多JVM笔记:

https://blog.csdn.net/qq_40262372/article/details/113733631

B站视频讲解如何三个月学习JAVA拿到实习Offer:

https://www.bilibili.com/video/BV1dV411t71K

B站,VX关注:万小猿,我们会不断努力更新更多相关的知识笔记

如果想要在学习的道路上和更多的小伙伴们交流讨论

请加Q群:725936761

欢迎每一位小伙伴的加入

我们一起朝着目标加油!冲锋陷阵!

Java对象创建过程相关推荐

  1. Java 并发编程解析 | 如何正确理解Java对象创建过程,我们主要需要注意些什么问题?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 从接触 Java 开发到现在,大家对 Java 最直观的印象是什么呢?是它宣传的 &qu ...

  2. java 对象创建过程_5种创建Java对象的方式

    在本篇文章中,将介绍5种创建Java对象的方式.类是创建对象的基本模板,接下来将介绍5种不同的方式,利用Java类来实例化Java对象. 1. 使用new关键字 ​ 采用new关键字实例化对象是Jav ...

  3. java 创建对象的init_Java 对象创建过程。init 方法和 clinit方法。

    Java 对象创建过程 判断是否加载.分配内存(指针碰撞或者空闲链表).初始化为零值.设置对象头(实例是哪个类的实例.类的元信息位置.GC 分代年龄等).init 方法. Java 虚拟机创建一个对象 ...

  4. JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配

    文章目录 前言 零.排序规范 1.happens-before原则 2.找文档位置 一.一线互联网企业关于对象面试题: (后面回答的就是这几个问题) 二.对象创建过程 三.对象在内存中的存储布局 1. ...

  5. java方法区对象类型_浅谈Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

  6. Java类加载及对象创建过程详解

    类加载过程 类加载的五个过程:加载.验证.准备.解析.初始化. 加载 在加载阶段,虚拟机主要完成三件事: 通过一个类的全限定名来获取定义此类的二进制字节流. 将这个字节流所代表的静态存储结构转化为方法 ...

  7. 【JVM】Java对象创建的流程步骤

    · 本文摘要 · 罗列Java创建对象的各种方式: · 讲解Java对象创建的流程步骤: 一.Java创建对象的各种方式 · 1. 用关键字new,老少皆知的方法:StringBuffer sb = ...

  8. JVM篇--详解对象创建过程-对象结构-对象访问方式

    hello,hello,刚学过的东西瞬间忘记,是我年龄大了还是年龄大了,可我明明才20出头啊(凑不要脸),其实25了,偏题了....今天整理一下关于JVM对象篇的结构,会记录对象创建过程,还有对象的内 ...

  9. Java对象创建的方式(简洁明了)

    前言 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.我们每天创建很多对象,那你知道Java中创建对象的方式有几种吗? 本文将介绍Java创 ...

  10. Mybatis--SqlSession对象创建过程

    Mybatis--SqlSession对象创建过程 一. 源码阅读 二. 文字总结 三. 图像总结 mybatis是个很方便的框架,其中最重要的无疑就是session对象了.知其然,知其所以然才能不断 ...

最新文章

  1. Android打Path的方法
  2. docker 集群中文件挂载的问题
  3. 第二十六天 iptables的nat功能
  4. Django定义全局变量
  5. python用代码表示5与2的整除_Python教程5:Python 2.x和Python 3.x的区别有哪些?
  6. Nginx-常见服务器的对比
  7. WebRTC的现状和未来:专访W3C WebRTC Chair Bernard Aboba(上)
  8. 命令执行——系统命令执行(三)
  9. Elasticsearch 基础入门(二)
  10. java中readline函数_自定义BufferedReader中read和readLine方法
  11. C/C++程序训练6—歌德巴赫猜想的证明
  12. 缺钱的特斯拉,是否在走向“乐视化”?
  13. 风云的银光志Silverlight4.0教程之遍历访问客户端用户的本地文件
  14. HTML5系列代码:用户注册页面
  15. zigbee学习之JN5169 ADC外设
  16. uncompyle6出现Unknown magic number 227
  17. PaddleHub创意之艺术风格迁移
  18. markdown 输入积分符号
  19. Linux MySQL数据库的备份
  20. MATLAB基础学习

热门文章

  1. Bootstrap模态框如何垂直居中?
  2. js小游戏---扫雷
  3. java输入语句buffer_Java输入流之BufferReader和Scanner的用法!
  4. 绥化二中高考成绩查询2021,2014绥化中考
  5. SLAM--线性化求解估计位姿
  6. opc服务器的时间怎么修改,OPC服务器是否允许在其逻辑中使用源时间戳?(Is OPC server allowed to use source timestamp in its logic?)...
  7. php2.3.2,自动加载 - ThinkPHP3.2完全开发手册
  8. python遗传算法最短路径问题有几种类型_用遗传算法求解最短路径问题.pdf
  9. html5怎么插入一段文字,HTML5教程—文字插入进度动画_HTML5教程_文字插入_动画进度_课课家...
  10. Python列表和元组:[] ()