【JVM】内存模型
堆(Heap)
一般Eden:S0:S1=8:1:1
对象创建流程
- 一般情况下,新创建的对象都会被分配到
Eden
区,一些特殊的大的对象会直接分配到Old
区。 - 在同一个时间点上,S0和S1只能有一个区有数据,另外一个是空的。S0有数据,S1为空。
- 一般
Old
区都是年龄比较大的对象,或者相对超过了某个阈值(Eden区无法存放)的对象。
对象生命周期理解
- 我是一个普通的Java对象,我出生在
Eden
区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。 - 有一天Eden区中的人实在是太多了,我就被迫去了
Survivor
区的From
区,自从去了Survivor区,我就开始漂了,有时候在 Survivor的From区,有时候在Survivor的To
区,居无定所。 - 直到我18岁的时候,爸爸说我成人了,该去社会上闯闯 了。 于是我就去了
Old
区那边,Old区里人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。
对象的GC过程
- Eden区内存空间使用达到临界值,触发一次
Minor GC
,GC之后将存活的对象从Eden复制到Survivor的From区,然后清空Eden区中的这些对象。 - 再次触发一次
Minor GC
,Eden区中所有存活的对象会被复制到To区,原来From区中对象的年龄+1,如果年龄达到之前设置好的年龄阈值,此时这些对象会被移动到Old区。这样Eden区和From区没有达到阈值的对象会被复制到To区。这时候From和To交换角色,之前的From变成了To ,之前的To变成了From。 Minor GC
会一直重复这样的过程,直到To区被填满,然后会将所有对象复制到老年代中。- 触发一次
Major GC
,回收Old区中的对象,通常也会伴随着一次Minor GC
- 触发一次
Full GC
,回收Young和Old区中的对象
非堆(Non-heap)
- JDK>=8:Metaspace
- JDK<8:Perm Space
评论区