对象创建与内存分配
创建过程
虚拟机遇到 new 指令时,首先到常量池中检查该指令的参数信息是否能定位到一个类
的符号引用,并检查该符号引用所代表的类是否已经被加载、解析和初始化过,若没有则进
行类加载过程,当检查通过后将为对象分配内存。
例如:Object obj = new Object();会执行以下 java 指令,主要分以下三步:
new 分配内存空间,并初始化为默认值,称为对象的半初始化;
invokespecial 调用构造器,初始化对象;
astore_1 建立本地变量(对象引用)obj 与内存地址的关联;
注:(此处对象指普通 java 对象不包括数组与 Class 对象)
内存分配
分配方式:
指针碰撞:对于规整的 java 堆内存采用的分配方式
空闲列表:对于不规整的 java 堆内存采用的分配方式
注: 如何选择分配方式取决于采用的哪种垃圾收集器,带有压缩整理功能的收集器采用
指针碰撞方式如 Serial、ParNew 等,如 CMS 这种基于 Mark-Sweep 算法的收集器则采用
空闲列表方式
对象内存分配流程: