网站首页 > 文章精选 正文
分代回收算法(Generational Garbage Collection)是一种垃圾回收技术,用于提高垃圾回收的效率,特别是在内存管理方面。该算法的核心思想是根据对象的生命周期将它们分为不同的代,并对不同代的对象采取不同的回收策略。
分代回收算法的基本概念
- 年轻代(Young Generation):
- 包含新创建的对象。
- 回收频率高,因为大多数对象很快就会变得不可达。
- 一般分为三个区域:Eden、Survivor From 和 Survivor To。
- 老年代(Old Generation):
- 包含生命周期较长的对象,即从年轻代提升上来的对象。
- 回收频率低,但回收时会占用较长时间。
- 永久代(Permanent Generation):
- 存储类信息、方法等相对稳定的数据。
- 在Java 8及之后被Metaspace取代,不再使用PermGen。
工作流程
- 年轻代回收(Minor GC):
- 对象创建: 新对象被分配到Eden区。
- Minor GC: 当Eden区无法分配给新对象足够的存储空间时,就会触发Minor GC。Eden区中的存活对象年龄先+1然后复制到Survivor To区,之后Eden区会整体清空。
- Survivor区交换: 当Eden区再一次存满时触发新一次Minor GC时,Eden区和 Survivor To存活对象都会年龄+1,然后判断年龄阀值,超过的晋升老年代,直接复制到老年区,未超过的复制到Survivor From区,如果Survivor From空间不足存储存活对象,超出的部分直接晋级为老年代,复制到老年区,然后Eden区和Survivor To区都会整体清空,并且Survivor To改名为Survivor From,Survivor From改名为Survivor To完成Survivor区交换。
- 老年代回收(Major GC 或 Full GC):
- 当对象晋升到老年代时,通常是直接将这些对象存储到老年代的内存空间中。如果老年代有足够的空闲空间来容纳这些对象,它们会直接被存储在老年代中。
- 如果老年代的空间不足以容纳新晋升的对象,JVM会触发老年代的垃圾回收(Full GC 或 Major GC)来清理老年代中的无用对象,以腾出足够的空间。
- 老年代的垃圾回收会遍历整个老年代的内存,清除不再使用的对象,尝试回收空间。这个过程可能涉及多种回收策略,如标记-清除、标记-整理等。
新生代晋升为老年代对象条件
- 如果年轻代的空间不足以容纳新创建的对象或当前存活的对象,垃圾回收器会触发Minor GC。
- 新生代中的对象会经历多次垃圾回收(Minor GC),每次回收后存活的对象会被移动到Survivor区域并增加年龄计数。
- 当对象的年龄达到一定阈值(通常是15或从其他配置中得出的),它们会被晋升到老年代。这个阈值可以通过JVM参数进行配置,例如 -XX:MaxTenuringThreshold。
优点
- 高效的内存回收: 通过频繁回收年轻代中的短命对象,大大减少了老年代中需要回收的对象数量。
- 减少停顿时间: 年轻代回收过程较快,减少了应用程序的停顿时间。
缺点
- 复杂性: 实现和调优相对复杂,需要平衡年轻代和老年代的大小、回收频率等。
- 内存碎片: 在使用标记-清除算法时,可能会产生内存碎片。
猜你喜欢
- 2025-07-23 JVM中哪些是线程共享区,哪些是线程独占区
- 2025-07-23 线上服务 FGC 问题排查,看这篇就够了
- 2025-07-23 JVM运行时内存区域、堆内存分段机制
- 2025-07-23 JVM运行数据区深度解析(jvm运行时区域)
- 2025-07-23 开发者必备!线上内存泄漏排查的 8 个 Linux 实战工具
- 2025-07-23 内存溢出满分排查步骤,看完不用担心拿不到Offer了
- 2025-07-23 关于JVM调优,看这篇就够了(jvm调优实战简书)
- 2025-07-23 那么大个对象的垃圾回收有什么不同
- 2025-07-23 GC分代年龄为什么是15?(对象gc的分代年龄保存在)
- 2025-07-23 JVM参数调优,一文让你搞懂,再也不为应用操心了!
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)
- fmt.println (52)