Hot Spot虚拟机新生代为什么是一个eden+2个survivor

本文介绍了Hot Spot虚拟机新生代的内存布局,解释了为何选择eden+2个survivor的空间分配策略。新生代采用复制算法,以eden为主,两个survivor空间交替使用,避免内存碎片,提高垃圾收集效率。文章强调了这种设计是出于性能考虑,且基于Cheney算法的变体。
摘要由CSDN通过智能技术生成

注:本文针对Hot Spot虚拟机

一、分代收集

在很多时候,JVM中对象的生命周期差距较大,部分对象可能是“朝生夕死”的(大部分),而部分对象可能又是比较“命长”的(小部分)。所以根据对象生命周期的特点,我们将堆空间分为几个区域,比如新生代、老年代,在不同的分代可以采取不同的收集算法,以最大化效率。

二、新生代与复制算法

不考虑特殊情况,对象会优先分配到新生代,并且对象大多都是朝生夕死的,每次新生代GC都会有大批的对象死去,只有少量存活,所以新生代一般采取“复制算法”来进行垃圾收集。

复制算法的思想就是将内存空间划分为大小相等的两部分,每次只使用其中一块,当这块内存不足以容纳新对象的时候,就将存活的对象复制到另外一块上,然后将前一块内存空间中使用的内存一次性清理掉,这样在内存分配时就不用考虑内存碎片的情况了,既简单又高效。

三、一个eden和一个survivor

既然采取复制算法,那我们就需要把新生代内存空间进行划分。但是在新生代中的对象大多数都是短命的,如果将新生代划分为大小相等的两部分的话,就太浪费内存空间了,所以即使我们需要划分新生代空间,也并不需要按照1:1的标准来。既然大多数对象都是短命的,那么我们按照一个大空间、一个小空间来进行划分就好了嘛,这最好再增加一个可配置参数,让用户可以根据实际情况来进行调整。对象优先分配到大的那块空间,

Java中的垃圾收集器(GC)是自动的,它们负责回收不再使用的对象,并释放它们所占用的内存。为了让GC更加高效,Java的堆内存被分为不同的区域,其中包括新生代和老年代。以下是为什么要分新生代和老年代的几个原因: 1. 垃圾收集算法的选择:不同的垃圾收集算法适用于不同的对象。新生代通常包含刚刚被创建的对象,这些对象的寿命通常很短。因此,使用复制算法来清理新生代会更加高效。老年代则包含已经存活了一段时间并且不再被频繁使用的对象,因此使用标记-清除算法或标记-整理算法来清理老年代会更加高效。 2. 内存分配效率:新生代采用了Eden空间和两个Survivor空间的组合,因此当对象被创建时,它们被分配到Eden空间中。当Eden空间满了之后,垃圾收集器会将其中的存活对象移动到其中一个Survivor空间中,并清空Eden空间。在经过多次垃圾回收之后,仍然存活的对象会被移动到老年代中。这种方式的好处是,内存分配的效率更高,因为对象的生命周期短暂,大部分对象会在Eden空间中被回收掉。 3. 垃圾回收的时间:由于新生代中的对象寿命短暂,因此垃圾回收的频率也会更高。分离出新生代和老年代可以让垃圾回收器更加高效地回收内存,提高应用程序的性能。 综上所述,分离出新生代和老年代可以使垃圾回收器更加高效地回收内存,提高Java应用程序的性能和内存利用率。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值