首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java:什么是Java中的分代垃圾收集?

Java垃圾收集器实现了一种按年龄对对象进行分类的分代垃圾收集策略。

必须标记和压缩JVM中的所有对象是低效的。随着越来越多的对象被分配,对象列表会增加,导致垃圾收集时间变长。应用程序的经验分析表明,Java中的大多数对象都是短期的。这就是为什么Java将对象分类为几代,并相应地执行垃圾收集。

年轻一代

新创建的对象始于年轻一代。年轻一代进一步细分为:

l 伊甸园空间—所有新对象都从这里开始,初始内存分配给它们

l 幸存者空间(FromSpace和ToSpace)—在经历了一个垃圾收集周期后,对象从伊甸园移到这里。

当对象被年轻一代垃圾收集时,这是一个小的垃圾收集事件。当伊甸园空间充满对象时,将执行次要GC。所有死亡对象都被删除,所有活着的对象都被移动到一个幸存者空间。次要GC还检查幸存者空间中的对象,并将它们移动到另一个幸存者空间。

以以下顺序为例:

1.伊甸园拥有所有对象(活的和死的)

2.小规模的垃圾收集—所有死亡对象都会从伊甸园中移除,所有活动对象都将移动到S1(FromSpace),伊甸园和S2现在是空的。

3.新对象被创建并添加到伊甸园,伊甸园和S1中的一些物体已经死亡。

4.小规模的垃圾收集—所有死亡对象都从伊甸园和S1中移除,所有活动对象都移动到S2(ToSpace),伊甸园和S1现在是空的。

因此,在任何时候,一个幸存者空间总是空的。当幸存物体达到一定的移动阈值时,它们会移动到老一代。你可以使用-Xmn标志来设置年轻一代的大小。

老一代

长寿物体最终会从年轻一代转移到老年一代,这也被称为“终身世代”,它包含了在幸存者空间中停留很长时间的对象。为对象的使用期限定义了一个阈值,该阈值决定了在将其移到旧一代之前,它可以存活多少个垃圾收集周期。

当对象从老一代被垃圾收集时,这是一个主要的垃圾收集事件。你可以使用-Xms和-Xmx标志来设置堆内存的初始大小和最大大小。

由于Java使用了分代垃圾收集,对象存活的垃圾收集事件越多,它在堆中的提升就越大。它从年轻一代开始,如果存活时间足够长,最终会在终身制一代结束。

请考虑以下示例,以了解对象在空间和代之间的升级:

当一个对象被创造时,它首先被放入年轻一代的伊甸园空间。一旦发生一次小的垃圾收集,来自伊甸园的活动对象将被提升到FromSpace。当下一次小垃圾收集发生时,来自伊甸园和FromSpace的活动对象将移动到ToSpace,此循环持续特定次数,如果对象在这一点之后仍在使用,下一个垃圾收集周期将把它移到老一代空间。

永久代

类和方法等元数据存储在永久代中。JVM在运行时根据应用程序使用的类填充它,不再使用的类可能会被永久生成垃圾收集。你可以使用-XX:PermGen和-XX:MaxPermGens标志来设置永久代的初始大小和最大大小。

元空间

从Java 8开始,元空间内存空间取代了PermGen空间。实现与PermGen不同,堆的这个空间现在自动调整大小,这避免了由于堆的PermGen空间有限而导致应用程序内存不足的问题。元空间内存可以被垃圾收集,当元空间达到最大大小时,不再使用的类可以被自动清理。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20221031A05WRP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券