Java 对象创建流程
2020-11-05 15:32:58 14 举报
Java对象创建过程
作者其他创作
大纲/内容
读取类信息
执行构造函数(父类优先)
空闲列表方式
初始化:初始化类静态变量和其他静态资源语句
指针碰撞:假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump The Pointer)
分配内存空间(大小已知)
准备:在方法区分配内存并设置变量初始值(默认零值)
连接
将字节流中的静态数据结构转化为方法区运行时数据结构
验证,对文件格式,语义和安全性校验
解决指针分配的线程安全问题:1:使用CAS尝试并重试2:使用(Thread Local AllocationBuffer,TLAB)每个线程在堆中有预分配缓存区
生成Class对象作为方法区该类的访问入口
选择策略(存在线程安全问题)
为分配的内存块赋值(零值)如果使用TLAB则此操作可以在期间进行
创建对象
完成
在\"方法区\"查找类符号引用
空闲列表:如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”(Free List)
指针碰撞方式(要求堆空间规整)
设置对象头(包含MarkWord,指向元数据的指针,如果是数组还有长度)
解析:将常量池内的符号引用转换位直接引用
创建完成
未完成
如果为static final 则为指定值
加载
根据类的全限定名词加载类的二进制字节流
0 条评论
下一页