详解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直接使用了标记-清除算法,这里就不细说了

目录
相关文章
|
3天前
|
监控 算法 Java
JVM之GC算法的实现(垃圾回收器)
JVM之GC算法的实现(垃圾回收器)
|
5天前
|
算法 Java
垃圾回收机制(Garbage Collection,GC)是Java语言的一个重要特性,它自动管理程序运行过程中不再使用的内存空间。
【6月更文挑战第24天】Java的GC自动回收不再使用的内存,关注堆中的对象。通过标记-清除、复制、压缩和分代等算法识别无用对象。GC分为Minor、Major和Full类型,针对年轻代、老年代或整个堆进行回收。性能优化涉及算法选择和参数调整。
15 3
|
11天前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
36 3
|
15天前
|
存储 监控 算法
深入理解Java的垃圾回收机制(GC)实现原理
深入理解Java的垃圾回收机制(GC)实现原理
21 1
|
2天前
|
算法 Java 云计算
JVM垃圾回收的历史演进:从GC算法到垃圾回收器选择
JVM垃圾回收的历史演进:从GC算法到垃圾回收器选择
|
4天前
|
监控 数据可视化 Java
如何在Java中优化垃圾回收(GC)性能
如何在Java中优化垃圾回收(GC)性能
|
1月前
|
存储 算法 Java
JVM(垃圾回收机制 --- GC)
JVM(垃圾回收机制 --- GC)
43 5
|
1月前
|
Java 程序员 Python
JVM的垃圾回收机制(GC机制)
Java的JVM实行自动垃圾回收机制(GC),主要针对堆中的对象。当对象无引用可达时,被视为垃圾。垃圾回收包含“找垃圾”和“回收垃圾”两步。找垃圾通过引用计数(非Java使用)和可达性分析(Java使用)来识别无用对象。可达性分析从根对象开始遍历,未被标记的对象视为垃圾。回收垃圾常用标记清除方法,但可能导致内存碎片。此过程消耗资源,且碎片化影响内存分配效率。
25 1
|
1月前
|
存储 缓存 监控
Java垃圾回收(GC)机制详解
Java垃圾回收(GC)机制详解
28 1
|
1月前
|
存储 算法 Java
精华推荐 | 【JVM深层系列】「GC底层调优专题」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)
精华推荐 | 【JVM深层系列】「GC底层调优专题」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)
68 0