Java对象创建过程
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关注:万小猿,我们会不断努力更新更多相关的知识笔记
Java对象创建过程相关推荐
- Java 并发编程解析 | 如何正确理解Java对象创建过程,我们主要需要注意些什么问题?
苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 从接触 Java 开发到现在,大家对 Java 最直观的印象是什么呢?是它宣传的 &qu ...
- java 对象创建过程_5种创建Java对象的方式
在本篇文章中,将介绍5种创建Java对象的方式.类是创建对象的基本模板,接下来将介绍5种不同的方式,利用Java类来实例化Java对象. 1. 使用new关键字 采用new关键字实例化对象是Jav ...
- java 创建对象的init_Java 对象创建过程。init 方法和 clinit方法。
Java 对象创建过程 判断是否加载.分配内存(指针碰撞或者空闲链表).初始化为零值.设置对象头(实例是哪个类的实例.类的元信息位置.GC 分代年龄等).init 方法. Java 虚拟机创建一个对象 ...
- JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
文章目录 前言 零.排序规范 1.happens-before原则 2.找文档位置 一.一线互联网企业关于对象面试题: (后面回答的就是这几个问题) 二.对象创建过程 三.对象在内存中的存储布局 1. ...
- java方法区对象类型_浅谈Java内存区域与对象创建过程
一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...
- Java类加载及对象创建过程详解
类加载过程 类加载的五个过程:加载.验证.准备.解析.初始化. 加载 在加载阶段,虚拟机主要完成三件事: 通过一个类的全限定名来获取定义此类的二进制字节流. 将这个字节流所代表的静态存储结构转化为方法 ...
- 【JVM】Java对象创建的流程步骤
· 本文摘要 · 罗列Java创建对象的各种方式: · 讲解Java对象创建的流程步骤: 一.Java创建对象的各种方式 · 1. 用关键字new,老少皆知的方法:StringBuffer sb = ...
- JVM篇--详解对象创建过程-对象结构-对象访问方式
hello,hello,刚学过的东西瞬间忘记,是我年龄大了还是年龄大了,可我明明才20出头啊(凑不要脸),其实25了,偏题了....今天整理一下关于JVM对象篇的结构,会记录对象创建过程,还有对象的内 ...
- Java对象创建的方式(简洁明了)
前言 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.我们每天创建很多对象,那你知道Java中创建对象的方式有几种吗? 本文将介绍Java创 ...
- Mybatis--SqlSession对象创建过程
Mybatis--SqlSession对象创建过程 一. 源码阅读 二. 文字总结 三. 图像总结 mybatis是个很方便的框架,其中最重要的无疑就是session对象了.知其然,知其所以然才能不断 ...
最新文章
- Android打Path的方法
- docker 集群中文件挂载的问题
- 第二十六天 iptables的nat功能
- Django定义全局变量
- python用代码表示5与2的整除_Python教程5:Python 2.x和Python 3.x的区别有哪些?
- Nginx-常见服务器的对比
- WebRTC的现状和未来:专访W3C WebRTC Chair Bernard Aboba(上)
- 命令执行——系统命令执行(三)
- Elasticsearch 基础入门(二)
- java中readline函数_自定义BufferedReader中read和readLine方法
- C/C++程序训练6—歌德巴赫猜想的证明
- 缺钱的特斯拉,是否在走向“乐视化”?
- 风云的银光志Silverlight4.0教程之遍历访问客户端用户的本地文件
- HTML5系列代码:用户注册页面
- zigbee学习之JN5169 ADC外设
- uncompyle6出现Unknown magic number 227
- PaddleHub创意之艺术风格迁移
- markdown 输入积分符号
- Linux MySQL数据库的备份
- MATLAB基础学习
热门文章
- Bootstrap模态框如何垂直居中?
- js小游戏---扫雷
- java输入语句buffer_Java输入流之BufferReader和Scanner的用法!
- 绥化二中高考成绩查询2021,2014绥化中考
- SLAM--线性化求解估计位姿
- opc服务器的时间怎么修改,OPC服务器是否允许在其逻辑中使用源时间戳?(Is OPC server allowed to use source timestamp in its logic?)...
- php2.3.2,自动加载 - ThinkPHP3.2完全开发手册
- python遗传算法最短路径问题有几种类型_用遗传算法求解最短路径问题.pdf
- html5怎么插入一段文字,HTML5教程—文字插入进度动画_HTML5教程_文字插入_动画进度_课课家...
- Python列表和元组:[] ()