Java对象创建过程

整体流程

虚拟机在收到一条new指令后,首先取检查这个指令的参数是否能够在常量池定位到类的符号引用,并且检查这个符号引用是否已被加载、解析和初始化过。如果没有执行一段类的加载过程,随后按照加载的类信息在内存中给对象分配一段内存空间,接着设置对象的表头信息,最后把对象按照程序员的意愿进行初始化,返回对象的地址。


Untitled Diagram.jpg

内存分配

内存分配的方式主要包括两种,指针碰撞和空闲列表。

  • 指针碰撞,将已用内存的尾指针往空闲内存方向移动对象所需要分配空间的大小。移动出来的内存空间作为对象的空间。
  • 空闲列表,从空闲的列表中找出足够大的空间作为对象的空间。

选择哪种分配方式取决于Java堆是否规整,而java堆是否规整取决于垃圾收集器是否有压缩整理功能。
Serial和ParNew带Compact过程采用指针碰撞,CMS基于Mark-Sweep算法采用空闲指针。
内存空间的分配的同步方式有CAS算法机制和本地线程缓存机制。

表头设置

设置包括哪个类的实例,类的元数据信息、对象哈希吗、对象GC分代年龄。

执行init方法

执行类代码中的init方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容