概述
Java 技术体系所提倡的自动内存管理最终可以归纳为自动化的解决两个问题:给对象分配内存以及回收分配给对象的内存。关于回收内存这一点,在本系列的第二章介绍了虚拟机中的垃圾收集器体系以及运作原理,本小节我们主要探讨一下 HotSpot 虚拟机在 Java 堆中对象分配、布局和访问全过程以及内存分配与回收策略。
对象的内存分配,往大的方向讲,就是在堆上分配(但也可能经过 JIT 编译后被拆散为标量类型并间接的在栈上分配),对象主要分配在新生代 Eden 区上,如果启动了本地线程分配缓冲,将按线程优先在 TLAB(本地线程分配缓冲)上分配。少数情况下,也可能直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。
本节下面的代码在测试时使用 Client 模式虚拟机运行,没有手工指定收集器组合,换句话说,验证的是在使用 Serial / SerialOld 收集器下(ParNew / SerialOld 收集器组合的规则也基本一致)的内存分配和回收策略。