JVM内存模型划分
根据JVM规范,JVM 内存共分为Java虚拟机栈,本地方法栈,堆,方法区,程序计数器,五个部分。
1. Java堆(线程共享)
Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都要在堆上分配。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。
从内存回收的角度看,由于现在收集器基本都采用分代收集算法,所以Java堆还可以细分为新生代和老年代;再细致一点的有Eden空间、From Survivor空间和To Survivor空间等。
从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。
根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的。
如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会