当前位置:网站首页>对象的创建
对象的创建
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直接把程序编译成与目标机器指令集相关的二进制代码。
边栏推荐
- English grammar_ Adjective / adverb Level 3 - precautions
- Interview questions for audio and video positions in Dachang -- today's headline
- Actual combat of flutter - fast implementation of audio and video call application
- Implement a Prometheus exporter
- Summary of SQL query de duplication statistics methods
- uni-app微信小程序一键登录获取权限功能
- Opencv video quality diagnosis - VIDEO occlusion diagnosis
- GB28181的NAT穿透
- 论文阅读【Learning to Discretely Compose Reasoning Module Networks for Video Captioning】
- ffmpeg 错误码
猜你喜欢
Introduction and installation of crunch, and making password dictionary with crunch
Flutter 实战-快速实现音视频通话应用
Shell advanced
白盒加密技术浅理解
数字化转型企业成功的关键,用数据创造价值
Nacos configuration file publishing failed, please check whether the parameters are correct solution
AAAI2020: Real-time Scene Text Detection with Differentiable Binarization
商业智能BI开发和报表开发有什么本质区别?
Methods of finding various limits
精耕渠道共謀發展 福昕攜手偉仕佳傑開展新產品培訓大會
随机推荐
sql查询去重统计的方法总结
Task: denial of service DOS
如何正确使用Vertx操作Redis(3.9.4带源码分析)
Shell高级进阶
Detailed explanation of JUnit unit test framework
白盒加密技术浅理解
Bao, what if the O & M 100+ server is a headache? Use Xingyun housekeeper!
uni-app微信小程序一键登录获取权限功能
Live HLS protocol
Collect Tiktok video
OpenCV视频质量诊断----视频遮挡诊断
Learning records of building thingsboard, an Internet of things platform
Parallelism, concurrency and life cycle of threads
奔赴山海之前,毕业季一定要做的那些事情
Opencv video quality diagnosis - VIDEO occlusion diagnosis
Compile ffmpeg source code with msys+vs2019 under win10
web开发常用的开源框架的开源协议整理
Facebook聊单,SaleSmartly有妙招!
How to redraw the header of CListCtrl in MFC
Why has instagram changed from a content sharing platform to a marketing tool? How do independent sellers use this tool?