整体流程
虚拟机在收到一条new指令后,首先取检查这个指令的参数是否能够在常量池定位到类的符号引用,并且检查这个符号引用是否已被加载、解析和初始化过。如果没有执行一段类的加载过程,随后按照加载的类信息在内存中给对象分配一段内存空间,接着设置对象的表头信息,最后把对象按照程序员的意愿进行初始化,返回对象的地址。
Untitled Diagram.jpg
内存分配
内存分配的方式主要包括两种,指针碰撞和空闲列表。
- 指针碰撞,将已用内存的尾指针往空闲内存方向移动对象所需要分配空间的大小。移动出来的内存空间作为对象的空间。
- 空闲列表,从空闲的列表中找出足够大的空间作为对象的空间。
选择哪种分配方式取决于Java堆是否规整,而java堆是否规整取决于垃圾收集器是否有压缩整理功能。
Serial和ParNew带Compact过程采用指针碰撞,CMS基于Mark-Sweep算法采用空闲指针。
内存空间的分配的同步方式有CAS算法机制和本地线程缓存机制。
表头设置
设置包括哪个类的实例,类的元数据信息、对象哈希吗、对象GC分代年龄。
执行init方法
执行类代码中的init方法。
网友评论