【JVM-02】垃圾收集(回收)算法

【JVM-02】垃圾收集/回收算法

  • [1. 分代收集算法](#1. 分代收集算法)
  • [2. 标记-清除算法](#2. 标记-清除算法)
  • [3. 标记-复制算法](#3. 标记-复制算法)
  • [4. 标记-整理算法](#4. 标记-整理算法)

1. 分代收集算法

分代收集(回收)算法根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

比如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的所以我们可以选择"标记-清理"或"标记-整理"算法进行垃圾收集。

2. 标记-清除算法

算法分为"标记"和"清除"阶段:首先标记出所有需要回收的对象,在标记完成后,统一清除(回收)掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。它是最基础的收集算法,会带来两个明显的问题:第一个是执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低;第二个是内存空间的碎片化问题,标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

3. 标记-复制算法

标记-复制算法为了解决标记-清除算法面对大量可回收对象时执行效率低的问题。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。缺点是内存支持量偏低,优点是不会产生内存碎片。

4. 标记-整理算法

根据老年代的特点特出的一种标记算法,标记过程仍然与"标记-清除"算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一段移动,然后直接清理掉端边界以外的内存。

相关推荐
robch14 分钟前
golang container/heap 是一个为任意类型实现堆(优先队列)接口的包
数据结构·算法·golang
967715 分钟前
力扣面试经典150 88. 合并两个有序数组 归并排序的merge函数
算法·leetcode·面试
yunyun321238 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
放下华子我只抽RuiKe58 小时前
算法的试金石:模型训练、评估与调优的艺术
人工智能·深度学习·算法·机器学习·自然语言处理·数据挖掘·线性回归
m0_662577978 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
oem1108 小时前
C++中的享元模式实战
开发语言·c++·算法
流云鹤8 小时前
每日一题0316
算法
ℳ๓₯㎕.空城旧梦8 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
leonkay8 小时前
Golang语言闭包完全指南
开发语言·数据结构·后端·算法·架构·golang
Allnadyy9 小时前
【C++项目】从零实现高并发内存池(一):核心原理与设计思路
java·开发语言·jvm