JVM内存模型——堆
报价宝综合消息JVM内存模型——堆
堆是用于存放物件的内存区域。因此,它是垃圾收集器(GC)管理的主要目标。
其具有以下特点
堆在逻辑上划分为“新生代”和“老年代”。由于JAVA中的物件大部分是朝生夕灭,还有一小部分能够长期的驻留在内存中,为了对这两种物件进行最有效的回收,将堆划分为新生代和老年代,并且执行不同的回收策略。不同的垃圾收集器对这2个逻辑区域的回收机制不尽相同,在后续的章节中我们将详细的讲解。堆占用的内存并不要求物理连续,只需要逻辑连续即可。堆可扩充套件内存大小,使用“-Xms”与“-Xmx”控制堆的最小与最大内存,扩充套件动作交由虚拟机器执行。但由于该行为比较消耗效能,因此一般将堆的最大最小内存设为相等。堆是所有执行绪共享的内存区域,因此每个执行绪都可以拿到堆上的同一个物件。堆的生命周期是随着虚拟机器的启动而建立。堆的内容
new出来的物件和阵列堆的结构
堆在逻辑上分为‘年轻代’和’老年代‘。年轻代又分为‘出生区’和‘幸存者区’。幸存者区又分为‘to区’和‘from区’。结构图如下:
堆的异常
每个JVM在启动时会分配一定量的内存。当堆无法为物件分配内存时,会丢掷OutOfMemoryError异常。正常情况下,堆无法为新物件分配内存时会触发一次GC以释放内存空间,GC后依然无法为物件分配内存时就出报异常。可通过一直new物件而不释放来模拟此过程。程式码如下:

上述程式码中物件不断的被建立而不进行引用释放,导致GC无法回收堆内存,最终OutOfMemoryError,错误资讯:
