什么是堆空间,它包含了哪部分?

110 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

什么是堆空间,它包含了哪部分?

在了解这个问题之前首先要了解一下堆空间是什么,堆空间它是jvm上内存最大的一块区域,我们创建的几乎所有对象都是可以在这存储的,像我们平常 new 一个对象的时候这个对象一般就是会存储在堆内存中。
以我们最常见的 Hotspot 虚拟机为例,堆空间为了方便GC对对象进行分配和回收,通常可以把对空间进行以下形式的划分

image.png

其中最明显的分区就是新生代和老年代,就很直观的可以看到堆空间主要分为了这两块,一般情况下我们创建的对象都是存储在新生代的 Eden 区,然后如果这个对象经历了多次的垃圾回收,他的年龄到达了一定的阈值,那么就会把这个对象划分至老年代中,一般情况下这个阈值就是15次。
在新生代里面它还有进一步的划分比如 S0 和 S1,一般情况下 Eden 区它的比例比较大,然后 S0 和 S1 会一样大,一般情况下这个分配比例就是 8:1:1。
因为在新生代里面它会采用复制算法,所以一般来说按照复制算法的模型就需要把内存等额的 一 分为 二,一部分进行使用,一部分进行垃圾回收时进行复制,所以它的利用率只有百分之50,所以为了新生代的区域利用率高一点,那么就把这部分的区域划分了一个非常大的空间占据了百分之八十的 Eden区域,凡是新创建的区域它就在这里分配。

所以堆空间中包含了 新生代、老年代,其中新生代又包含了 Eden 区域、S0 区域、和 S1 区域。