- Java虚拟在执行Java程序时会将其管理的内存划分为不同的数据区域,分别为:
- 虚拟机栈
- 堆
- 方法区
- 程序计数器
- 本地方法栈
- 对于大多数应用来说,堆是java虚拟机所管理内存最大的一块
- 生命周期:java堆在虚拟机启动的时候创建,被所有线程所共享
- 用途:
- java虚拟机规范中描述:所有的对象实例和数组都是在堆上分配内存,但是随着JIT即时编译的发展和逃逸分析技术的逐渐成熟,栈上分配、标量替换等技术会导致"所有"变得不那么绝对。
- java堆用于存放对象实例,几乎所有的对象实例都是在Java堆上分配内存
- 垃圾回收:
- 从内存回收的角度看,由于现在的收集器基本采用分代收集算法,所以Java堆也被分为新生代和老年代。新生代又被分为eden区域和两个survivor区域
- Java堆是GC收集器工作的主要区域,因此很多时候Java堆也被称为GC堆
- java堆是否需要物理上连续的内存空间?
- 根据虚拟机规范,java堆可以处于物理上不连续的内存空间,只要逻辑上是连续的即可。
- java堆是否可以扩展?
- 在实现时,java堆可以实现为可扩展的,也可以实现为固定大小的。不过主流的虚拟机都是按照可扩展方式来实现的,通过-xmx和-Xms参数来进行控制。
- 异常情况:
- 如果堆中的内存无法满足实例所需内存,且现有物理内存无法满足堆内存的扩展时,将会抛出OutOfMemory异常。