目录
首先、我们先通过一张思维导图了解一下java的存储模型
在正式了解这个神奇的过程之前,先用小白的角度理解来揭开它神秘的面纱
第一、如果你是一个区域的管理者,你是将所有的东西随便放在你的辖区,还是将他们分区存储,答案显而易见,JAVA的设计者们可不傻,他们也是这样做的。 如果我们想知道创建一个对象后,他会在JAVA的世界里是如何存储的,你就必须知道:"几乎所有的"对象都是存储在堆中,而堆区又分为新生代和老年代,他们的占比是 1:2,很明显老年代的内存占用大,故他担任的责任就越大,而新生代又分为Eden区、幸存者区,比例是:4:1;
第二、按照我们的逻辑,存数据应该是在从小的区域存储,如果小的区域存不下,再往大的区域存储,如果大的也存不下,那就BBQ了,再者,小的区域肯定容易维护;
第三、如果我们要存储的区域满了,我们应该把里面的"垃圾"清理一下,再判断是否可以放新东西,如果可以放下,我们还有必要把数据再进行移动吗?
第一步:产生一个对象、要判断新生代的Eden区是否可以放下,如果可以放下,分配对象内存;如果放不下,执行YGC垃圾回收机制
(
进行YGC时,Eden中的旧对象会被进行清理,幸存者【依然存在引用的对象】会判断是否在survivor区放得下,如果可以存下,放入s1/s0区,并判断对象存活是否超过阈值(age>=15),如果大于,新生代晋升老年代;如果放不下,存入Old区
)
第二步:执行结束垃圾回收机制,再次判断Eden区是否可以放得下,如果可以放下,分配对象内存; 如果放不下,判断Old区是否放得下。
第三步:在Old区如果可以放下,分配对象内存; 如果放不下,执行FGC垃圾回收机制。
第四步:再次判断Old区是否可以放得下,如果可以放下,分配对象内存; 如果放不下,抛出OOM异常