3. 内存加载过程 - 图1

image.png

内存分配

虚拟机创建一条new指令时,首先将检查这个指令的参数是否能在常量池定位一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化过,如果没有,那必须先执行类的加载过程。
类加载完,接下来分配内存。类加载完以后,对象需要分配的内存可以确定,接下来就是要从堆中对这个对象allocate一小块内存了。

指针碰撞

如果对象在内存中规则排列,没有空隙,用过的内存在一边,没用过的在另一边,中间放着一个指示器,那么分配内存,仅仅是把指针移动一段和待分配内存相等的距离,这个叫指针碰撞。

空闲列表

如果对象在内存排列不规整,已使用和未使用空间交错,就需要维护一个列表,记录哪块内存可用,哪块内存不可用。在分配的时间,从空闲列表中找出一个能容纳下的内存区用来安置新对象,这个叫空闲列表。

java内存分布是否规整是由gc决定的,Serial. ParNew带compact的gc采用指针碰撞,cms等采用空闲列表。