本文主要来讲解一下关于JVM的面试题,这在Java面试中也是十分常见的,虽然在实际工作中很少会接触到由于JVM调优的事情,但是面试官却经常问,所以对于一些理论知识,我们也是需要掌握的。都知道JVM体系结构分为方法区、堆heap、栈stack,本地方法栈Native Method Stack以及程序计数器Program Counter Register,本文要讲的是JVM为什么要区分新生代和年老代?对于新生代又要区分eden区和survial区?
在回答这个问题之前,先了解JVM堆中对象是如何进行垃圾回收的,都知道JVM将堆分成新生代和年老代,大概比例是1:2,新生代又把区分eden区和survial区,比例为8:2.
新生代, 是类诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾收集器收集,结束生命。
老年代,存放的时候经历新生代垃圾回收,15次,还在的对象。具体对象垃圾回收过程:
1:eden、SurvivorFrom 复制到 SurvivorTo,年龄+1
当Eden区满的时候会触发第一次GC把还活着的对象拷贝到SurvivorFrom区,当Eden首先,区再次触发GC的时候会扫描Eden区和From区域对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域(如果有对象的年龄已经达到了老年的标准,则贴值到老年代区),同时把这些对象的年龄+1
2::清空 eden、SurvivorFrom
然后,清空Eden和SurvivorFrom中的对象,也即复制之后有交换,谁空谁是to
3::SurvivorTo和 SurvivorFrom 互换
最后,SurvivorTo和SurvivorFrom互换,原SurvivorTo成为下一次GC时的SurvivorFrom区。部分对象会在From和To区域中复制来复制去如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代
回答问题本身,JVM为什么要区分新生代和年老代?对于新生代又要区分eden区和survial区?很重要的一点就是为了上述的辣椒回收,试想一下,如果只有一个区域,那么创建消耗对象都在一个地方,那么在垃圾回收的时候,就要全局扫描一整个区域,而且如果对于经常调用的对象,也要全局扫描,效率十分低的,所以JVM将内存分为不同的代(Generation)是为了更有效地管理内存和优化垃圾回收。而且不同区域大小也可以动态配置。
JVM为什么要区分新生代和年老代?
1.优化垃圾回收效率:
2.提高对象分配和回收的效率:
为什么新生代要分为Eden和Survivor?
1.分代管理
2.提高空间利用和效率
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。