博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中对象创建过程
阅读量:6463 次
发布时间:2019-06-23

本文共 903 字,大约阅读时间需要 3 分钟。

本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象。

1.类加载检查

虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。

2.为新生对象分配内存

对象所需内存的大小在类加载完成后便可以完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。划分的方法主要有两种:

a、指针碰撞

     如果java堆中内存是绝对规整的,所有用过的内存都放在一边,未使用的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个

指针指向空闲空间那边挪动一段与对象大小相等的距离。

b、空闲列表

   如果java堆中的内存并不是规整的,已使用的内存和未使用的内存相互交错,就无法使用指针碰撞了,虚拟机必须维护一个列表来记录哪些内存是可用的,在分配的时候

从列表中找到一块足够大的空间划分给对象实例并更新表上的记录。

3.后续工作

内存分配完成后,虚拟机需要将分配到的内存空间初始化为零值(不包括对象头),然后对对象进行必要的设置(主要是对象头信息的设置)。

此时,在虚拟机看来一个新的对象已经产生了,但是从程序员的角度来看,对象创建才刚刚开始,需要执行<init>方法,把对象按照程序员的意愿进行初始化。

 

附录

对象在虚拟机中存储的布局可以分为3块区域:对象头、实例数据和对齐填充。

对象头包含两部分信息:第一部分用于存储对象自身的运行时数据(如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID以及偏向时间戳等)。

另一部分是类型指针,即对象指向它的类元数据的指针,如果对象是一个Java数组,对象头中还必须有一块用于记录数组长度的数据。

实例数据部分是对象真正存储的有效信息,也就是程序代码中所定义的各种类型的字段内容。

对齐填充并不是必然存在的,仅仅起着占位符的作用,因为HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍。

转载于:https://www.cnblogs.com/bywallance/p/5892019.html

你可能感兴趣的文章
android 等待圈_Android ProgressDialog 转圈圈
查看>>
join为什么每个字符都分割了 js_js中join()与 split()的对比
查看>>
antd 动态添加表单_antd中form表单添加与删除
查看>>
蓝桥杯单片机十一届省赛_卓因学员斩获第十一届“蓝桥杯”全国创意编程大赛一等奖...
查看>>
c语言倒计时不影响进程_linux学习15,执行程序就像读文章,换本书就相当于切换了进程...
查看>>
float正则表达式 带逗号_python正则表达式小试牛刀
查看>>
cf卡序列号修改工具_雄迈测试工装工具
查看>>
$.getjson异常信息提示_SpringBoot 异常处理
查看>>
数字盲打怎么练_一篇文章告诉你关于学习盲打的知识
查看>>
anaconda处理大数据_大数据的处理流程
查看>>
饲料码垛机器人技术方案_坐标机器人码垛机的技术和结构特点
查看>>
access查询成绩小于5分_CPA考生59分真相:成绩查询当天,他其实有一次通过的机会...
查看>>
asp手机拍照显示_手机 | 华为P50外形曝光:首次采居中挖孔、后摄类似Mate40
查看>>
风电场数据库_如何让风电场更友好、更智慧?
查看>>
全局 快捷键_让同事看呆的表格快捷键
查看>>
# 保持最外层获取焦点_PCB外层的蚀刻工艺,如何把控蚀刻质量
查看>>
华为如何生成日志_深入理解Kafka服务端之滚动生成新日志段的流程及条件
查看>>
各维度 特征 重要程度 随机森林_随机森林算法梳理
查看>>
手机悉昙体梵文输入法_梵文天城体字体及输入法
查看>>
qt编译实现简单的文本编译器有粘贴复制_QT示例之实现简易文本编辑器
查看>>