当前位置:网站首页>对象的创建
对象的创建
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直接把程序编译成与目标机器指令集相关的二进制代码。
边栏推荐
- Contos 7 搭建sftp之创建用户、用户组以及删除用户
- 事务隔离级别 gap锁 死锁
- Helium transmission line of lake shore cryostat
- 采集抖音视频
- 线程的并行、并发、生命周期
- 论文阅读【Learning to Discretely Compose Reasoning Module Networks for Video Captioning】
- What must be done in graduation season before going to Shanhai
- Simplified pinduoduo product data
- 【无标题】
- Transform + ASM data
猜你喜欢

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

Summary of SQL query de duplication statistics methods

Dlib+opencv library for fatigue detection

原生js打造日程表-支持鼠标滚轮滚动选择月份-可以移植到任何框架中

【森城市】GIS数据漫谈(一)

Salesmartly has some tricks for Facebook chat!

商业智能BI开发和报表开发有什么本质区别?

Ubuntu14 install MySQL and configure root account local and remote access

Enabling "new Chinese enterprises", SAP process automation landing in China

论文泛读【FiLM: Visual Reasoning with a General Conditioning Layer】
随机推荐
ffmpeg 音频相关命令
Basic use of MySQL
Nat penetration of gb28181
为什么一定要从DevOps走向BizDevOps?
精耕渠道共谋发展 福昕携手伟仕佳杰开展新产品培训大会
Why must we move from Devops to bizdevops?
H264编码profile & level控制
论文阅读【Learning to Discretely Compose Reasoning Module Networks for Video Captioning】
Live HLS protocol
论文阅读【Discriminative Latent Semantic Graph for Video Captioning】
The intelligent epidemic prevention system provides safety guarantee for the resumption of work and production at the construction site
Native JS creates a calendar - supports mouse wheel scrolling to select months - and can be ported to any framework
CMU AI PhD 第一年总结
Opencv video quality detection -- sharpness detection
Actual combat of flutter - fast implementation of audio and video call application
数字化转型企业成功的关键,用数据创造价值
直播HLS协议
Methods of finding various limits
如何正确使用Vertx操作Redis(3.9.4带源码分析)
Go语言高级