尚硅谷2020最新版宋红康JVM教程-10-对象实例化内存布局与访问定位
转载:
https://www.bilibili.com/video/BV1PJ411n7xZ
参考:
https://gitee.com/moxi159753/LearningNotes/tree/master/JVM,
https://www.cnblogs.com/yanl55555/p/12623447.html
对象的实例化
面试题
美团:
对象在JVM中是怎么存储的?
对象头信息里面有哪些东西?
蚂蚁金服:
二面:java对象头里有什么
对象创建方式
new:最常见的方式(本质是构造器)
变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法
Class的newInstance方法:反射的方式,只能调用空参的构造器,权限必须是public(在JDK9里面被标记为过时的方法)
Constructor的newInstance(XXX):反射的方式,可以调用空参的,或者带参的构造器,权限没有要求
使用clone():不调用任何的构造器,要求当前的类需要实现Cloneable接口中的clone接口
使用序列化:从文件中、从网络中获取一个对象的二进制流
第三方库 Objenesis
创建对象的步骤
2、为对象分配内存
首先计算对象占用空间的大小,接着在堆中划分一块内存给新对象。如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小
说明:选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。
3、处理并发问题
采用CAS配上失败重试保证更新的原子性
每个线程预先分配TLAB - 通过设置 -XX:+UseTLAB参数来设置(区域加锁机制)
4、初始化分配到的内存
1 属性的默认初始化
2 显示初始化
3 代码块中的初始化
4 构造器初始化
内存分配结束,虚拟机将分配到的内存空间都初始化为零值(不包括对象头)。这一步保证了对象的实例字段在Java代码中可以不用赋初始值就可以直接使用,程序能访问到这些字段的数据类型所对应的零值。
5、设置对象的对象头
将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。这个过程的具体设置方式取决于JVM实现。
6、执行init方法进行初始化
在Java程序的视角看来,初始化才正式开始。初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。 因此一般来说(由字节码中是否跟随有invokespecial指令所决定),new指令之 后会接着就是执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全创建出来。
对象的内存布局
- 运行时元数据
哈希值( HashCode )
GC分代年龄
锁状态标志
线程持有的锁
偏向线程ID
偏向时间戳 - 类型指针
指向类元数据的InstanceKlass,确定该对象所属的类型 - 如果是数组还需要记录数组的长度
小结
public class Customer {int id = 100;String name;Account account;{name = "new后才有的名字";}}class Account{}
public class CustomerTest {public static void main(String[] args) {Customer customer = new Customer();}
}
对象的访问定位
句柄访问
- 缺点:占用空间、间接指向对象实例。
- 优点:定位稳定:当对象实例发生移动(垃圾回收算法,内存整理算法),则不需要修改reference到句柄的定位地址,仅需要在句柄内修改间接地址,重新定位到对象实例即可。
直接指针(HotSpot采用)
尚硅谷2020最新版宋红康JVM教程-10-对象实例化内存布局与访问定位相关推荐
- 尚硅谷2020最新版宋红康JVM教程更新至中篇(java虚拟机详解,jvm从入门到精通)
目录 类的加载第一步----loading 加载".class"文件的方式: 类的加载第二步----linking![在这里插入图片描述](https://img-blog.csd ...
- 尚硅谷2020最新版宋红康JVM教程-中篇-第3章类的加载过程(类的生命周期)详解-4-过程三:Initialization(初始化)阶段
static与final的搭配问题 初始化阶段,简言之,为类的静态变量赋予正确的初始值. 具体描述 类的初始化是类装载的最后一个阶段.如果前面的步骤都没有问题,那么表示类可以顺利装载到系统中.此时,类 ...
- 尚硅谷2020最新版宋红康JVM教程-16-垃圾回收相关概念
转载: https://www.bilibili.com/video/BV1PJ411n7xZ 参考: https://gitee.com/moxi159753/LearningNotes/tree/ ...
- 尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-02和03-类的加载器分类
引言 JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader). 从概念上来讲,自定义类加载器 ...
- 尚硅谷 宋红康 JVM教程_02_字节码与类的加载篇
本系列相关链接 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇--01 (20210103-20210110) https://blog.csdn.net/wei198621/article/de ...
- 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇——02
本系列相关链接 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇--01 (20210103-20210110) https://blog.csdn.net/wei198621/article/de ...
- 尚硅谷-宋红康-JVM上中下篇完整笔记-JVM上篇_内存与垃圾回收篇
前言 一.jvm及java体系结构 1. Java及JVM简介 TIOBE语言热度排行榜 https://www.tiobe.com/tiobe-index/ 世界上没有最好的编程语言,只有最适用于具 ...
- 尚硅谷2020最新版周阳SpringCloud(H版alibaba)框架开发教程 学习笔记
前言:今天看到周阳老师出了新课,十分欣喜,很喜欢周阳老师的讲课风格,内容也充实,我也算是周阳老师忠实粉丝啦. 新出的springcloud第二版很符合我现阶段的学习需求.但美中不足的是,目前只有视频资 ...
- 尚硅谷-宋红康-JVM上中下篇完整笔记-JVM中篇
一.Class文件结构 1.概述 1.1 字节码文件的跨平台性 所有的JVM全部遵守Java虚拟机规范:Java SE Specifications,也就是说所有的JV环境都是一样的,这样一来字节码文 ...
最新文章
- winform模拟登陆网页_【教程】模拟登陆网站 之 C#版(内含两种版本的完整的可运行的代码)...
- MATLAB中的三角函数单位问题
- 软件的安装目录 linux,linux 软件安装目录详解
- leecode53 最大子序列和
- 为ASP.NET MVC应用添加自定义路由
- 西工大学计算机专业考研容易吗,2022年西北工业大学计算机专业考研成功经验...
- ios html 全选文本框,【前端】IOS input输入框按删除键删除字符,删除最后一个字符时,概率性出现光标前面多余一个字符...
- 2018 蓝桥杯 C++ A组 1-7
- matlab模型预测控制基本原理,matlab模型预测控制
- canvas教程7-炫彩小球
- 硬盘的IDE和串口什么意思
- 强大的Winform Chart图表控件使用说明
- 计算机组成原理是答案,计算机组成原理(上)_答案mooc
- Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset I3D论文精读
- matlab 输入坐标,matlab中坐标希腊符号的输入方法
- 【Linux开发环境搭建】之Nginx安装
- 从15亿到5000亿 eBay收购PayPal成硅谷传奇
- linux下deb包如何安装
- 阿里内贸团队敏捷实践
- 尼日利亚4g频段_全球主要4G频段资料全解.doc