文章目录
对象的创建
对象创建的主要流程

一、类加载检查
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
new指令对应到语言层面上讲是,new关键词、对象克隆、对象序列化等。
二、分配内存
在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类 加载完成后便可完全确定,为对象分配空间的任务等同于把 一块确定大小的内存从Java堆中划分出来。
这个步骤有两个问题:
- 如何划分内存。
- 在并发情况下, 可能出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。
划分内存的方法
- “指针碰撞”(Bump the Pointer)(默认用指针碰撞)
如果Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。 - “空闲列
本文深入探讨了JVM中对象的创建过程,包括类加载检查、内存分配(涉及指针碰撞和空闲列表策略)、初始化零值、设置对象头以及执行构造方法。此外,还详细阐述了对象半初始化、内存分配策略如栈上分配和Eden区分配,以及对象内存回收的引用计数和可达性分析算法。最后,讨论了对象和类的无用判定标准。
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



