江的福浅谈JVM堆及GC的引入

一个JVM实例只存在一个堆内存中,堆内存的大小是可以调节的,类加载器读取了类文件后,需要把类、方法、常变量,放到堆内存中,保存所有引用类型的真实信息,以便执行器执行。
堆内存在物理上分为两部分:新生区、养老区
堆内存在逻辑上分为三部分:新生区,养老区,还有java8将永久区更名的元空间。

接下来聊聊堆内存中是如何管理数据的。(无限地new对象)
当伊甸园区满了之后,开启GC(也可以被称为YGC或轻GC)开启之后,伊甸园区基本会全部清空。但也会有幸存者,这个时候幸存者就会进入幸存者0区、幸存者一区。为什么是这两个?其实准确的来说应该是叫from区。有点不懂,这个问题先放一放,接下来,如果某一个幸存者gc15次(默认参数)之后还存活,那么它将被转到养老区。

举个🌰吧
战争是冷酷的,每时每刻都有成千上万的身躯与融进那片血泊之中,幸存者寥寥无几。但幸存下来的都是人民的英雄。

一批新兵蛋子第一次进入战斗时,他们被分配在伊甸园区进行修整,二牛和傻蛋就是其中的两个兵。轰隆隆,战斗打响了(当伊甸园区满时,gc清理数据),但幸运的是,最终二牛和傻蛋活了下来,然后被组织升为中级将领,被分配到了幸存区去生活(但这不意味着他们将不参与战斗),但是幸存区其实被分为两部分from区和to区,那么他们应该进入哪个部分呢?这里借用周阳老师讲课时用的ppt。
在这里插入图片描述
在这里插入图片描述
还不懂的话,再来听我小声bb😬
每一位新兵或是幸存区的中级将领,每次都进入from区,但是from区,to区其实只是一个挂在营地上的牌子,是为了迷惑敌人的,会随着战争,而交替变换,即
第一次 东边 from 西边to
第二次 东边 to 西边from
·········
而每次幸存者都要进入from,中级将领进入from区需要通过复制算法。
当有幸存者活过了十五次,也就是经历了15次gc依旧存活,那么进入养老区。

在这里插入图片描述
oom即 OutOfMemory

在这里插入图片描述
继续引用一下阳哥的ppt。堆空间和元空间的关系,阳哥说像中国大陆和中国台湾的关系。逻辑上绝对拥有,实际上本地人还是不认同。
元空间其实是方法区的一种实现。


永久区中的数据几乎不会被处理,就像是rt.jar。
就写这么多吧。
晚安。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值