详解gc(垃圾回收)机制六:分代垃圾回收

简介: 详解gc(垃圾回收)机制六:分代垃圾回收

分代垃圾回收

人们在众多程序案例中总结出了一个经验:"大部分的对象在生成后,经过调用之后马上就变成了垃圾,很多有对象能活的很久"

分代垃圾回收利用该经验,在对象中导入了"年龄"的概念,经历过一次GC后活下来的对象年龄会增长1岁

新生代对象和老年代对象

分代垃圾回收中把对象分类成几代,根据不同的代数,使用不同的GC算法,我们把刚生成的对象称为新生代,到达一定年龄后称为老年代

新生代

新生代对象大部分会变成垃圾,我们可以通过只找活动对象的算法(标记清除,GC复制,标记压缩等),在一次算法之后,很多对象都会死去,花费在GC上的时间就会减少

注意,新生代对象大部分会变成垃圾,所以不需要通过 引用计数方法去做GC,因为标记到的新生代对象大部分都会变成垃圾,无需做引用计数

老年代


在新生代对象中活过多次之后,新生代晋升成了老年代对象

由于老年代对象很难成为垃圾,所以我们可以减少对老年代对象执行GC的频率

ungar分代垃圾回收

首先,我们需要将堆空间隔离成4个空间:

生成空间,2个幸存空间,老年代空间

根据变量  $new_start,$survivor1_start,$survivor2_start,$old_start 4个变量引用开头地址.

大小分别默认为  140k,28k,28k,940k

同时准备一个记录集数组,$rs

image.png

启动新生代GC

所有新分配的对象,都将进入生存空间,当生成空间满了之后,将启动GC复制算法.

将正在使用的幸存空间作为from空间,未使用的作为to空间,生成空间和from幸存空间的活动对象都会被复制到to幸存空间中

这些活动对象的年龄都会增加1岁

image.png

注意:在执行新生代GC中,除了会引用根的活动对象,还得将老年代空间的对象当成根,将老年代引用的对象作为活动对象处理

image.png

进入老年代空间


当幸存空间的对象活过一定的年龄之后,将通过GC复制算法,将对象复制到老年代空间当中

记录集


分代垃圾回收的优点就是只将垃圾回收的重点放到新生代对象身上,以此来缩减GC的时间,但是在上面我们知道,老年代的变量也可能引用到新生代的变量,那就意味着我们需要搜索整个老年代空间的所有对象去找引用,这样就大大的削减了分代垃圾回收的机制

因此,我们通过记录集来记录老年代对象到新生代对象的引用,在新生代GC时,不去搜索老年代堆空间,而是直接找到记录集中记录存在引用关系的老年代对象进行关联

image.png

老年代GC


老年代GC直接使用了标记-清除算法,这里就不细说了

目录
相关文章
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
75 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
2月前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
78 0
|
3月前
|
缓存 Java Python
python垃圾回收&缓存机制
python垃圾回收&缓存机制
|
3月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制(GC)
本文将探讨Java的自动内存管理核心——垃圾回收机制。通过详细解析标记-清除算法、复制算法和标记-整理算法等常用垃圾回收算法,以及CMS、G1等常见垃圾回收器,帮助读者更好地理解Java应用的性能优化和内存管理。同时,探讨分代收集、分区收集等策略在实际项目中的应用。结语部分总结了垃圾回收机制在Java开发中的重要性,并展望了未来可能的发展。
81 0
|
4月前
|
缓存 监控 Java
"Java垃圾回收太耗时?阿里HBase GC优化秘籍大公开,让你的应用性能飙升90%!"
【8月更文挑战第17天】阿里巴巴在HBase实践中成功将Java垃圾回收(GC)时间降低90%。通过选用G1垃圾回收器、精细调整JVM参数(如设置堆大小、目标停顿时间等)、优化代码减少内存分配(如使用对象池和缓存),并利用监控工具分析GC行为,有效缓解了高并发大数据场景下的性能瓶颈,极大提升了系统运行效率。
101 4
|
4月前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
5月前
|
监控 算法 Java
Java面试题:如何在Java中触发一次Full GC?请详细解释垃圾回收机制和知识
Java面试题:如何在Java中触发一次Full GC?请详细解释垃圾回收机制和知识
407 4
|
5月前
|
存储 监控 算法
Java面试题:解释分代垃圾回收策略,并说明其优势
Java面试题:解释分代垃圾回收策略,并说明其优势
56 0
|
5月前
|
存储 并行计算 安全
Java面试题:Java内存管理、多线程与并发框架的面试题解析与知识点梳理,深入Java内存模型与垃圾回收机制,Java多线程机制与线程安全,Java并发工具包与框架的应用
Java面试题:Java内存管理、多线程与并发框架的面试题解析与知识点梳理,深入Java内存模型与垃圾回收机制,Java多线程机制与线程安全,Java并发工具包与框架的应用
86 0