1 类加载检查
虚拟机遇到new指令
时,会去常量池
中检查是否有这个类的符号引用
,并且检查这个符号引用代表的类是否被加载、解析、初始化
。
2 分配内存
对象所需内存大小
在类加载完成后即可确定,从Java堆
中划分一块确定大小
的内存。
内存分配的两种方式:
2.1 指针碰撞
适用场合
:堆内存规整
原理
:用过的内存放一边,没用过的放另一边,中间有一个分界值指针
。向着没用过内存方向将分界值指针移动对象内存大小
位置。
GC收集器
:Serial、ParNew
2.2 空闲列表
适用场合
:堆内存不规整
原理
:虚拟机维护一个列表
,该列表中会记录哪些内存时可用的。寻找一块足够大的内存,分配给对象,最后更新列表
。
GC收集器
:CMS
3 初始化零值
将分配到的内存空间初始化为零值
(不包括对象头)。保证了对象的字段
可以不赋初始值就可以直接使用。