JVM内存分配机制
4.1 对象的创建
4.1.1 类加载检查
虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。new 指令对应到语言层面上讲是,new 关键词、对象克隆、对象序列化等。
4.1.2 分配内存
在类加载检查通过后,虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配方式包括指针碰撞和空闲列表。选择哪种方式取决于 Java 堆是否规整,Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。
- 指针碰撞**(Bump the Pointer)**【默认用指针碰撞】
适用于堆内存规整(没有内存碎片)的情形。原理:用过的内存整理到一边,未使用的内存放在另一边,中间有一个分界值指针,只需要向着未使用过的内存方向将该指针移动对象内存大小位置即可。采用的 GC 收集器有 Serial 和 ParNew(因为使用标记-整理,不存在内存碎片)。
- 空闲