简单理解JVM内存模型

回顾一下:前边的文章已经说过JVM分为五个区域,其中线程私有的区域(程序计数器,虚拟机栈,本地方法栈),线程共享的区域
(堆heap,方法区Method Area)

内存模型:

在这里插入图片描述
非堆:也就是方法区Method Area
Young区:Young区分为两大块,一个是Survivor区(S0+S1),一块是Eden区。 Eden:S0:S1=8:1:1
Eden区:正常对象创建所在区域,大多数对象“朝生夕死”
Survivor区:Survivor区分为两块S0和S1,也可以叫做From和To。在同一个时间点上,S0和S1只能有一个区有数据,另外一个是空的。
Old区:一般Old区都是年龄比较大的对象,或者相对超过了某个阈值的对象。

为什么堆要划分young区和old区?

因为堆中要存放我们的java对象,如果不划分区域,将难以管理,不知道对象到底存活了多久。所以划分为young区和old区。
新创建的对象就放在young区,每经过一次GC年龄就+1,默认年龄到达15就进入到old区 。

为什么young区要划分为Eden区和Survivor区?

假如不划分,那么新建的对象都会放在Young区里,如果Young区内存不足就会触发GC回收点无用的对象,那么就会产生大量不连续的空间,如果在新建一个对象不能申请到连续足够的空间,是不是就又要触发GC了,我们要知道,每一次GC都是要消耗很多性能的,GC次数越少越好。
分区后,新建的对象都存放在Eden区,如果Eden区的内存满了就会触发GC,清除无用的对象,存活下来的对象会复制到Survivor区里,并将Eden区清空,这样是不是就避免了上边不能申请到连续足够的空间问题了。我们要知道Eden区的对象都是“朝生夕死”。

同上情况,也将Survivor区划分为S0区和S1区,在同一个时间点上,S0和S1只能有一个区有数据,另外一个是空的。
假如Survivor区来了个对象空间不够了,就会触发担保机制,向old区借一些空间来存放这个对象。

图解:

在这里插入图片描述

发布了26 篇原创文章 · 获赞 39 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45240169/article/details/104549654
今日推荐