堆内存是所有jvm管理的内存区域中最大的一块区域这块区域被所有线程共享,在虚拟机启动的时候创建,这块区域只存放我们所创建的对象实例和数组的信息,堆可以处于物理上不连续的空间,但是在逻辑上要视为连续的,这里也是垃圾回收器重点回收的地方我们可以通过jvm参数Xmx-Xms来指定此区域的大小。

基于垃圾收集器的堆内存划分

image.png
基于分代
在G1垃圾收集器以前的垃圾收集器都是基于分代设计 我们经常会听说新生代 、老年代、持久代(1.8以后变成了元空间)、Eden空间、FromSurvior空间、ToSurvio空间这些名词,基于分代设计的垃圾收集器需要与负责收集不同空间的垃圾收集器搭配使用,后面我会单独的用一篇文章详细介绍。
基于分区
以前的分代收集时,要么是回收新生代空间,要么是收集老年代空间,或者是整堆的收集,以G1为例,它可以面向堆中的任何一个部分组成一个回收集,衡量的标准不再是哪个代,而是哪块区域的垃圾最多,回收后的收益最大。这就是基于Region的堆内存布局,Region内存布局不同于之前的分代,它把堆内存划分成若干个大小相等且独立的Region区域。收集器可根据情况选择最大收益的区域进行回收。

异常信息

在堆内存中如果无法完成对象内存分配并且无法在进行内存的扩展时,虚拟机会抛出OutOfMemoryError异常。