当前位置:网站首页>对象的创建
对象的创建
2022-07-01 18:45:00 【辰 羽】
5、对象的创建
5.1、对象存储
对象创建后会存放在堆中,并产生一个内存地址。

在JVM中对象主要分三部分保存在堆中:
- 对象头:包括堆对象的布局、类型、GC的状态、同步状态和标识哈希等基本信息
- Mark Word:对象自身的运行时数据(哈希码、GC分代年龄、线程锁信息等)。在32位JVM中长度是32bit,在64位的JVM中是64bit。
- 类型指针:JVM通过类型指针确定该对象是哪个类创建的实例
- 数组长度(数组对象的)
- 实例数据:存放对象的属性值
- 对齐填充:为字节对齐,填充的数据,非必须。是为了让字段只出现在同一CPU的缓存行中
5.2、对象的创建过程
程序员编写一个类
.java文件编译为.class文件:首先通过Javac 编译器将.java 转为 JVM可加载的.class字节码文件
①词法解析器:通过空格分割出单词、操作符、控制符等信息,形成token信息流,传递给语法解析器。
②语法解析器:把token信息流按照Java语法规则组装成语法树。
③语义分析器:检查关键字使用是否合理、类型是否匹配、作用域是否正确等。
④生成字节码:将前面各个步骤的息转换为字节码。类加载的检查:虚拟机遇到关键字new,首先检查此指令对应的参数能否在常量池中定位到这个类的符号引用,并检查此符号引用代表的类是否被加载、解析和初始化过。如果没有则执行类加载。
类加载:将字节码文件放置到Java虚拟机中,通过类加载器加载。执行有三种模式,解释执行、JIT编译执行、JIT编译与解释器混合执行(主流JVM默认执行的方式)。混合模式的优势在于解释器在启动时先解释执行,省去编译时间。
确定类加载后,虚拟机为对象分配内存空间,分配方式有指针碰撞、空闲列表两种。
- 指针碰撞:堆的内存规整,使用过的内存划分到一边,空闲的在另一边,中间用一个指针为分界指示器,分配时把指向向空闲方向挪动相应大小距离
- 空闲列表:内存不规整,有碎片化,虚拟机需要维护一个列表记录那些内存可用,在分配时找到一个足够的空间进行分配,并更新列表记录。
而创建对象需要保证线程安全,通常采用两种方式
- CAS+失败重试:乐观锁的一种实现方式,假设没有冲突去创建,发生冲突就进行重试。
- TLAB:为每个线程在Eden去分配一块内存,在分配内存时首先在TLAB分配,对象大于TLAB中剩余内存或内存用尽时,再采用CAS。
初始化零值:虚拟机将分配的内存空间初始化为零值,保证对象实例字段正在Java中不赋初值就可以使用。
设置对象头:对象是哪个类的实例、找到不同的元数据、哈希吗、GC年龄等
执行init方法:将一个初始的对象按程序设计进行相关的初始化
通过即时编译器JT把字节码文件编译成本地机器码。
Java程序最初都是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会认定其为”热点代码”,热点代码的检测主要有基于采样和基于计数器两种方式,为了提高热点代码的执行效率,虚拟机会把它们编译成本地机器码,尽可能对代码优化,在运行时完成这个任务的后端编译器被称为即时编译器。
还可以通过静态的提前编译器 AOT直接把程序编译成与目标机器指令集相关的二进制代码。
边栏推荐
- 【无标题】
- Interview questions for audio and video positions in Dachang -- today's headline
- 如何正确使用Vertx操作Redis(3.9.4带源码分析)
- Parallelism, concurrency and life cycle of threads
- 音视频、编解码相关电子书、小工具,打包奉送!
- Compile ffmpeg source code with msys+vs2019 under win10
- 微信小程序 navigator点击后有阴影 ,去掉navigator阴影效果
- 原生js打造日程表-支持鼠标滚轮滚动选择月份-可以移植到任何框架中
- 使用环信提供的uni-app Demo,快速实现一对一单聊
- 精耕渠道共謀發展 福昕攜手偉仕佳傑開展新產品培訓大會
猜你喜欢

Shell高级进阶

见证时代!“人玑协同 未来已来”2022弘玑生态伙伴大会开启直播预约

ubuntu14安装MySQL并配置root账户本地与远程访问
![[pytorch record] automatic hybrid accuracy training torch cuda. amp](/img/a5/cf1eb2801380cf2887dfd532d3eb1e.jpg)
[pytorch record] automatic hybrid accuracy training torch cuda. amp

Native JS creates a calendar - supports mouse wheel scrolling to select months - and can be ported to any framework

118. Yanghui triangle

微信公众号开发相关流程及功能介绍

正则表达式=Regex=regular expression

Introduction and installation of crunch, and making password dictionary with crunch

A brief understanding of white box encryption technology
随机推荐
How to solve the problem of splash screen when the main and sub code streams of easygbs are h.265?
狼人杀攻略:你当我好骗吗,我们相信谁!
brpc理解
GB28181的NAT穿透
见证时代!“人玑协同 未来已来”2022弘玑生态伙伴大会开启直播预约
torch.nn.functional.interpolate函数
Junit单元测试框架详解
MFC中如何重绘CListCtrl的表头
智慧防疫系统为建筑工地复工复产提供安全保障
English grammar_ Adjective / adverb Level 3 - precautions
微信小程序 navigator点击后有阴影 ,去掉navigator阴影效果
118. 杨辉三角
SIP protocol of gb28181
直播HLS协议
Task: denial of service DOS
[to.Net] C set class source code analysis
What is the essential difference between Bi development and report development?
Detailed explanation of JUnit unit test framework
XML syntax, constraints
学习笔记【gumbel softmax】