随笔- 79  评论- 1  文章- 0 

jvm-内存模型

运行时数据区是一个逻辑视图,需要物理的实现,由JVM内存模型实现

内存模型


方法区和堆

  堆里面存储的是java对象,又因为大多数对象生命周期比较短 ,所以把短的放到Yong区 长的放old区 提高gc的效率

Eden区 和 S区

  所有声明周期比较短的对象中 如果只有一个young区 1,2,3,4,5--->直接进入到old区,又不希望old区对象很多,因为old区对象多了,就可能空间变小,变小就会触发old的gc操作,消耗的时间比较长

  新的对象创建直接在eden中创建,除非yuong区内存不够了会存在old区 也叫作内存空间担保

  young区进行一次gc  gc完成之后 有用的对象进行到survive区

为什么s区分S0和S1呢?

  不区分的话会造成空间的不连续性(因为当s区空间不够的话会直接到old区 造成空间不连续性)
S0和S1相同大小的空间,保证每次分配的空间是连续的,相对来说有空间的浪费

  Eden:S0:S1 为 8:1:1的空间比例

 

Old区会执行full gc     Eden区执行的是Minor gc 

当申请内存空间的时候会访问Eden区看是否有足够空间,true直接申请成功,false 会执行Minor gc操作JVM回收不活跃的对象

清理后会继续访问eden区是否有足够空间,有空间的话在Eden区新对象空间申请成功,

如果Eden区gc后还是没有空间的话会访问Survive区是否有足够空间,S区有空间会把Eden区的部分活跃对象复制到S区,在Eden申请到新对象空间。S区没空间的话

又会查看old区是否有空间,old区有空间的话会把s区的部分活跃对象复制到old区,再把Eden区的部分活跃对象复制到S区,然后在Eden区申请新对象的空间,

如果old区也没有空间的话会执行 Full GC操作 JVM回收对象  gc完之后会继续访问old的是否有足够空间,如果还是没有足够空间 直接报错 OutofMemoryError

如果有空间的话会把S区的部分活跃对象复制到Old区  把Eden区的部分活跃对象复制到S区 再在Eden区申请到新对象的空间

 

posted on 2020-02-27 22:16  pipizhou  阅读(...)  评论(...编辑  收藏