JVM 新生代和老年代介绍

本文介绍了JVM内存管理中新生代和老年代的细节,包括Eden、Survivor区的分配比例和作用,以及GC算法在不同区域的应用。新生代采用复制算法,设置两个Survivor区是为了避免碎片化并简化内存管理;老年代则使用标记整理算法,以处理存活时间长、大小大的对象。

新生代分为三个区域,一个Eden区和两个Survivor区,它们之间的比例为(8:1:1),这个比例也是可以修改的。通常情况下,对象主要分配在新生代的Eden区上,少数情况下也可能会直接分配在老年代中。

1.Eden区

Eden区位于Java堆的年轻代,是新对象分配内存的地方,由于堆是所有线程共享的,因此在堆上分配内存需要加锁。而Sun JDK为提升效率,会为每个新建的线程在Eden上分配一块独立的空间由该线程独享,这块空间称为TLAB(Thread Local Allocation Buffer)。在TLAB上分配内存不需要加锁,因此JVM在给线程中的对象分配内存时会尽量在TLAB上分配。如果对象过大或TLAB用完,则仍然在堆上进行分配。如果Eden区内存也用完了,则会进行一次Minor GC(young GC)。

2.Survival from 和 Survival to

Survival区与Eden区相同都在Java堆的年轻代。Survival区有两块,一块称为from区,另一块为to区,这两个区是相对的,在发生一次Minor GC后,from区就会和to区互换。在发生Minor GC时,Eden区和Survivalfrom区会把一些仍然存活的对象复制进Survival to区,并清除内存。Survival to区会把一些存活得足够旧的对象移至年老代。

3.GC 堆

Java 中的堆也是 GC 收集垃圾的主要区域。
GC 分为两种:Minor GC、Full GC ( 或称为 Major GC )。
Minor GC发生在新生代中的垃圾收集动作,所采用的是复制算法:
Full GC发生在老年代的垃圾收集动作,所采用的是标记-清除算法:

4.新生代

Java虚拟机每次使用新生代中的Eden和其中一块Survivor(From),在经过一次Minor GC后,将Eden和Survivor中还存活的对象一次性地复制到另一块Survivor(To)这里使用的复制算法进行GC,最后清理掉Eden和刚才用过的Survivor(From)空间。

将此时在Survivor(To)空间存活下来的对象的年龄设置为1,以后这些对象每在Survivor区熬过一次GC,它们的年龄就加1,当对象年龄达到某个年龄(默认值为15)时,就会把它们移到老年代中。

在新生代中进行GC时,有可能遇到另外一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象,这些对象将直接通过分配担保机制进入老年代;

5.年老代

年老代里存放的都是存活时间较久的,大小较大的对象,因此年老代使用标记整理算法。当年老代容量满的时候,会触发一次Major GC(full GC),回收年老代和年轻代中不再被使用的对象资源。

6、为什么新生代都是复制算法

因为新生代对象生存时间比较短,80%都是要回收的对象,采用标记-清除算法则内存空间碎片化严重,采用复制算法可以灵活高效,且便与整理空间。

7、老年代都是标记整理算法

标记整理算法解决来标记-清除算法的内存碎片化的问题,又解决了复制算法的两个Survivor区的问题,因为老年代的空间比较大,不可能采用复制算法,特别占用内存空间

8、为什么要设置两个Survivor区

首先看下复制算法:Survivor区,一块叫From,一块叫To,对象存在Eden和From块。当进行GC时,Eden存活的对象全移到To块,而From中,存活的对象按年龄值确定去向,当达到一定值(年龄阈值,通过-XX:MaxTenuringThreshold可设置)的对象会移到年老代中,没有达到值的复制到To区,经过GC后,Eden和From被清空。之后,From和To交换角色,新的From即为原来的To块,新的To块即为原来的From块,且新的To块中对象年龄加1。永远有一个survivor space是空的,另一个非空的survivor space无碎片。

为什么要这么做?

  • 没有Survivor区,eden区对象直接去老年代,造成老年代频繁FGC。
  • 一个Survivor容易使得Survivor的空间碎片化,因为eden区又存活对象,Survivor区也有存活对象,辅助的时候就会存在碎片化空间。
  • 即若只分一块Survivor,在清除Survivor区已死亡的对象时,因为此刻的Survivor区还有存活的对象,清除要比分两块Survivor麻烦,两块的情况,回收时只需将存活的对象移走,剩下的对象直接清理即可。
  • 另外,分成两块Survivor,From和To分工明确,逻辑理解和技术实现较简单。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值