【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )

简介: 【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )

文章目录

总结

一、标记-清除算法

二、复制算法

三、标记-整理算法

总结


常用的垃圾回收算法 :


标记-清除算法 ;

复制算法 ;

标记-整理算法 ;

这些算法没有好坏优劣之分 , 都有各自的 优势 和 弊端 , 都有各自的 使用场景 ; 一般的垃圾回收 , 都是几种垃圾回收算法结合起来一起使用 , 不同的场景下 , 使用不同的垃圾回收算法 ;


分代收集算法 : 该垃圾回收算法不是特定的回收算法 , 而是 合理地使用上述 3 33 个算法 , 在 不同的内存空间内 , 使用不同的垃圾收集器 ;


这里的分代 指的是 年轻代 , 老年代 ; 年轻代又分为 Eden 和 Survivor 两个区域 , Survivor 又分为 From 和 To 两个区域 ;






一、标记-清除算法


堆 内的内存区域如下 , 内存区域分为一个个内存块 , 某个对象可能占用 2 22 个内存块 , 也能占用若干个内存块 ;


如果 定位 找到了 垃圾对象 , 那么 将该 垃圾对象 进行标记 , 如下图 , 标记为 橙色 ;


标记好之后 , 在执行 GC 内存回收时 , 会 将 被标记的 内存 回收 ;

image.png



标记-清除算法优缺点 :


优点 : 算法 实现简单;

缺点 : 产生了很多 不连续的内存 , 如果对象比较大 , 要用 5 55 个内存块 , 会出现 OOM ;





二、复制算法


将 内存区域 , 分为两部分 ;


对象只放在 左侧区域 , 右侧区域 空着 ;


左侧区域 的 垃圾对象 回收后 , 将 存活 的对象 , 拷贝到 右侧区域 中 ;


image.png



复制算法优缺点 :


优点 : 解决了 内存碎片 问题 ; 效率高 ;

缺点 : 只能使用 一半内存 ;

复制算法 适合使用 内存量较小 , 但是 操作很频繁的区域 , 如 : 在 年轻代 的 Survivor 中 , 使用的就是 复制算法 垃圾回收机制 ;






三、标记-整理算法


标记-整理算法 是 标记-清除算法 的更完善的版本 , 标记-整理算法 解决了 内存碎片问题 ;


内存回收后 , 将内存中的对象重新 紧密地 排列 , 消除内存碎片 ;


image.png


标记-整理算法 优缺点 :


优点 : 消除了内存碎片 ;

缺点 : 性能较低 ; 执行该垃圾回收算法时 , 需要 对内存进行重排 , 此时不能随意变动内存的数据结构 , 因此 执行该 标记-整理算法 时 , 整个线程需要整体停下来 , 但这样大大影响程序的执行效率 ;


标记-整理 算法 , 不能用在 内存操作 活跃的场景中 , 如 : 老年代的垃圾回收 , 使用的是 标记-整理 算法 ;


目录
相关文章
|
10天前
|
存储 Java
深入理解Java虚拟机:JVM内存模型
【4月更文挑战第30天】本文将详细解析Java虚拟机(JVM)的内存模型,包括堆、栈、方法区等部分,并探讨它们在Java程序运行过程中的作用。通过对JVM内存模型的深入理解,可以帮助我们更好地编写高效的Java代码,避免内存溢出等问题。
|
12天前
|
算法 Java Go
Go vs Java:内存管理与垃圾回收机制对比
对比了Go和Java的内存管理与垃圾回收机制。Java依赖JVM自动管理内存,使用堆栈内存并采用多种垃圾回收算法,如标记-清除和分代收集。Go则提供更多的手动控制,内存分配与释放由分配器和垃圾回收器协同完成,使用三色标记算法并发回收。示例展示了Java中对象自动创建和销毁,而Go中开发者需注意内存泄漏。选择语言应根据项目需求和技术栈来决定。
|
2月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
21 0
|
2月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
89 0
|
1天前
|
存储 算法 Java
了解Java内存管理与垃圾回收机制
了解Java内存管理与垃圾回收机制
5 0
|
1天前
|
Oracle Java Serverless
JVM工作原理与实战(三十六):GraalVM虚拟机
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了GraalVM、GraalVM的两种运行模式、GraalVM应用场景、参数优化和故障诊断等内容。
|
2天前
|
Arthas 监控 算法
JVM工作原理与实战(二十五):堆的垃圾回收-垃圾回收算法
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了垃圾回收算法评价标准、标记清除算法、复制算法、标记整理算法、分代垃圾回收算法等内容。
15 0
JVM工作原理与实战(二十五):堆的垃圾回收-垃圾回收算法
|
2天前
|
存储 监控 安全
JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了运行时数据区、Java虚拟机栈等内容。
|
3天前
|
缓存 监控 算法
Java的垃圾回收机制
Java的垃圾回收机制自动管理内存,释放无引用对象占用的空间,防止内存泄漏和溢出。常见的算法有标记-清除、标记-整理、复制和分代收集。过程包括标记和清除/整理阶段。垃圾回收器由根集、标记位、空闲列表和卡片表等组件构成,有Serial、Parallel等不同类型的收集器可供选择。调优涉及堆内存设置、选择合适收集器及减少对象创建。注意避免过多短生命周期对象,利用缓存和对象池,谨慎处理finalize方法。理解并优化垃圾回收对提升Java应用性能至关重要。
|
15天前
|
算法 Java
JVM 垃圾回收算法(重要)
JVM 垃圾回收算法(重要)