JVM内存模型(堆内与GC)
一、堆与GC的联系.
在之前的课程中我们提到堆的概念的频率最高的,其实上堆还可以继续划分为更小的单位,可以划分为新生代(包括了伊甸园区、存活区、伸缩区)、老年代(老年代、伸缩区)、元空间(包括了伸缩区)下面请看图:
那么GC和我们的堆空间存在什么联系呢?为什么堆又被成为GC堆那?其实上我们在创建对象的时候很可能会触发GC线程,下面我们来看看对象创建的过程?
对象的创建会和堆空间发生密切的关系,其中也会在上面的区域触发GC。我们接下来分析GC触发的过程,GC线程会对垃圾进行回收(在对象创建的时候可能会引发GC线程来在堆中回收垃圾)。
对象的创建过程:
当创建一个新对象的时候需要为新对象申请空间,在伊甸园区申请,但是需要判断伊甸园区的空间是否充足,充足则申请成功,如果不充足则触发MinorGC回收不活跃的对象( 不经常使用的对象),回收之后再判断伊甸园区空间是否充足?
- |-充足则申请成功,对象也创建成功
- |-如果依然不充足,则判断存活区空间是否充足?
- |-如果存活区充足则将伊甸园区的部分活跃对象移到存活区,伊甸园的空间申请成功。
- |-如果存活区的空间不足则判断老年代空间是否充足?
- 1-充足则将存活区的部分活跃对象移动到老年代,之后将伊甸园区的活跃对象保存到存活区,空间申请成功。
- |-如果老年代的空间不充足则触发Full GC (MajorGC) 对堆区进行
完全彻底的垃圾回收,之后再判断老年代的空间是否充足,充足则将存活区的活跃对象移到老年代,再将伊甸园区的活跃对象移到存活区,空间申请成功。如果触发FullGC之后老年代的空间依然不足则会出现00M(OutOf Memory) 错误。
这种活跃对象逐步往上移动的过程叫做对象的晋升,以上就是对象的创建与GC的基本关系过程。
下面给你一张图你就可以根据图形记忆对象的晋升过程以及GC的触发条件了:
总结:
1、第一个重点:堆区的继续划分你要知道,具体划分为哪些区域你要记清楚
2、GC的触发条件
3、对象的晋升过程你要清楚
4、方法区的实现是元空间,这是在jdk1.8时候出现的,在jdk1.7的时候是使用
永久代来实现方法区,永久代是和堆相连的一块区域,容易导致内存溢出(不是我们之前学习的数据溢出),所以在jdk1.8的时候就废除了永久代而使用元空间代替,元空间是我们的物理内存实现。
以下是我整理的Java学习资料免费提供
对于刚学习Java的初学者,很多适合会感觉学的没有方向,越学越迷茫,这样的情况一般都是学习方法开始就是错误的。没有把Java技术进行专业系统化的学习。从就业和节约时间的角度考虑,如果有谁遇到这方面的问题,可以加入我的学习QQ裙:927296445 里面有相应的学习资料【Java最新基础精讲视频、面试题目、开发工具、PDF文档等】,可以自行来下载获取(适合初学者)多跟大家一起交流,不要一个人盲目的学,少走弯路才是学习Java最大的捷径
首发知乎码邦主