对象创建的五个步骤
虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
总结为 if(new指令的参数不在常量池 || 此符号引用的类没有被加载、解析和初始化)--------->{执行相应类加载}
在类加载检查完成后,虚拟机为new出来的对象分配内存。
新对象需要的内存大小在类加载完成后就已经确定,现在要做的是吧一块确定大小的内存从Java堆中划分出来。
分配方式涉及到两种:
指针碰撞 | 空闲列表 |
---|---|
堆内存规整时 | 堆内存不规整时 |
用过的内存放在一边,没用的放一边,中间有个分界值指针 | JVM维护一个列表记录划分的内存 |
GC收集器:Serial、ParNew | GC收集器:CMS |
堆内存规整与否取决于GC收集器的算法是标记-清除、还是标记-整理