Java 堆 是虚拟机管理的最大的一块内存。是被所有线程所共享的一块内存区域,在虚拟机启动时创建。
所有的实例和数组都在要堆上分配,但是随着JIT编译器的发展与逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术将会导至一些变化,所有的对象都分配在堆上也变得不那么绝对。
Java 堆是垃圾收集器管理的主要区域,也叫CG堆。由于现在收集器基本都爱用分代收集算法,
所以Java堆中还可以细分为:
新生代
和 老年代
。再细致一点的有: Eden 空间
、From Survivor 空间
、To Survivor 空间
等。从内存分配的角度来看,线程共享的Java堆中可能划多个线程私有的分配缓存区。
如何划分与存放内容无关,无论哪个区域,存储的都仍然是对象实例。进一步划分的目的是为了更好的回收内存、或都更快的分配内存。
Java 堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像磁盘空间。 堆的实现,即可固定大小,也可以扩展,通过 -Xms 和 -Xmx 控制。 如果堆中没有内存实例分配,并助理堆无法再扩展时,抛出 OutOfMemoryError