Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >九、垃圾回收算法

九、垃圾回收算法

作者头像
栋先生
发布于 2018-09-29 08:35:30
发布于 2018-09-29 08:35:30
3730
举报
文章被收录于专栏:Java成长之路Java成长之路

本文主要介绍垃圾收集算法的思想及其发展过程。

标记-清除算法(Mark-Sweep)

标记-清除算法是最基础的垃圾回收算法。后续的收集算法都是基于这种思路并对其不足进行改进得到的。 算法分为两个阶段: 1. 标记:首先标记出所有需要回收的对象(具体可见参见之前的博文) 2. 清除:在标记完成后统一回收被标记的对象

“标记-清除”算法示意图

缺点

  1. 效率问题:标记和清除的效率都不高
  2. 空间问题:标记清除会产生大量不连续的内存碎片,空间碎片太多会导致以后程序在运行的过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发一次垃圾会后动作。

复制算法 (Copying)

为了解决效率问题,“复制”算法出现了。 算法分为两个阶段: 1. 它将可用内存按容量分为大小相等的两块,每次只使用其中的一块。 2. 当这一块内存用完了,就将存活着的对象复制到另外一块上面,然后再把已经已使用过的内存空间一次性清理掉。

复制算法示意图

优点

每次对整个半区进行内存回收,不需要考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配内存即可,实现简单,简单高效

缺点

将内存缩小为了原来的一半,内存浪费太过严重。

标记-整理算法(Mark-Compact)

“标记-整理”算法和“标记-清除”算法类似。第一步都是标记,只是第二步略有不同。 算法分为两个阶段: 1. 标记:对需要回收的对象进行标记 2. 整理:让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

“标记-整理”算法示意图

分代收集算法 (Generational Collecting)

分代收集算法并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块。 一般把Java堆分为新生代老年代,根据各个年代的特点采用最适当的收集算法。 1. 在新生代中,每次垃圾回收都有大量对象死去,只要少量存活,那么就采用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。 2. 在老年代中因为对象的存活率高,没有额外的空间来为它进行分配担保,就必须采用“标记-整理”或者“标记-清除”算法来进行回收。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年04月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
垃圾回收算法
分为“标记”和“清除”两个阶段,首先会标记出所有要回收的对象,在标记完成后统一回收所有被标记的对象。
Li_XiaoJin
2022/06/10
3910
垃圾回收算法
JVM垃圾回收算法以及垃圾回收器机制
JVM中,程序计数器、虚拟机栈、本地方法栈都是都是线程私有的,随线程而生随线程而灭,栈帧(栈中的对象)随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理。
Java技术债务
2022/08/09
6070
JVM垃圾回收算法以及垃圾回收器机制
JVM垃圾回收算法
判断Java中对象存活的算法 1.引用计数器算法: 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象不再被使用,是“垃圾”了。 引用计数器实现简单,效率高;但是不能解决循环引用问问题(A对象引用B对象,B对象又引用A对象,但是A,B对象已不被任何其他对象引用),同时每次计数器的增加和减少都带来了很多额外的开销,所以在JDK1.1之后,这个算法已经不再使用了。 2.根搜索方法: 根搜索方法是通过一些“GCRo
java404
2018/05/18
6720
jvm垃圾回收算法有哪些_jvm垃圾回收过程
Java应用程序不用程序员手动管理内存中的垃圾回收,是因为JVM有专门的垃圾回收线程做这件事。当内存不够用时,会自动触发回收。为了在效率和内存碎片之间均衡,衍生出了一系列的垃圾回收算法。
全栈程序员站长
2022/10/01
2830
jvm垃圾回收算法有哪些_jvm垃圾回收过程
(4)JVM——垃圾回收算法
介绍:在程序运行过程中,程序计数器、虚拟机栈、本地方法栈 3 个区域随线程而生,随线程而灭,不用我们关注内存的回收。而 Java 堆和方法区不一样,此处的内存使用和回收是动态的,其中讲垃圾回收主要是在 Java 堆。
凡人飞
2020/09/20
3700
JVM垃圾回收算法
分为标记和清除两个阶段,首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象
终有链响
2024/07/29
990
JVM垃圾回收算法
jvm的垃圾回收算法_jvm垃圾回收策略
相比C语言,JVM虚拟机一个优势体现在对对象的垃圾回收上,JVM有一套完整的垃圾回收算法,可以对程序运行时产生的垃圾对象进行及时的回收,以便释放JVM相应区域的内存空间,确保程序稳定高效的运行,但在真正了解垃圾回收算法之前,有必要对JVM的对象的引用做一个简单的铺垫
全栈程序员站长
2022/10/01
7450
jvm的垃圾回收算法_jvm垃圾回收策略
JVM的垃圾回收算法
JVM的垃圾回收算法 一,如何判断对象已经消亡 1,引用计数算法 一个对象如果没有任何引用指向它,就可认为该对象已经”消亡“,这种方法有个缺点就是无法检测到引用环的存在。 算法特点 1. 需要单独的字段存储计数器,增加了存储空间的开销; 2. 每次赋值都需要更新计数器,增加了时间开销; 3. 垃圾对象便于辨识,只要计数器为0,就可作为垃圾回收; 4. 及时回收垃圾,没有延迟性; 5. 不能解决循环引用的问题; 2,根搜索算法 Java使用根搜索算法回收垃圾,该算法的基本原理:定义一系列名为GC Roots的
Spark学习技巧
2018/01/30
6320
JVM的垃圾回收算法
一张图看懂JVM之垃圾回收算法详解
导读 在之前的内容中,我们通过一张图的方式(图?),从总体上对JVM的结构特别是内存结构有了比较清晰的认识,虽然在JDK1.8+的版本中,JVM内存管理结构有了一定的优化调整。主要是方法区(持久代)
用户5927304
2019/07/31
4620
深入浅出JVM(十二)之垃圾回收算法
这里推荐一篇有关Spring Boot自动装配的文章:一文彻底弄懂 Spring Boot 自动装配的过程!深入探索与案例解析 文章以@SpringBootApplication注解作为入口,分析其自动装配的核心原理、优缺点,以及扩展根据条件加载,并总结使用案例
菜菜的后端私房菜
2024/11/21
1060
看一看JVM垃圾回收算法
Java有着自己一套的内存管理机制,不需要开发者去手动释放内存,开发者只需要写好代码即可,运行过程中产生的垃圾都由JVM回收。那JVM都是用哪些算法进行垃圾回收呢?
索码理
2022/12/28
2810
看一看JVM垃圾回收算法
【深入理解JVM】GC垃圾回收算法
  标记-清除算法由标记阶段和清除阶段构成。标记即将每一个可以从根对象访问到的对象都会被添加一个标识,于是这个对象就被标识为可到达对象。。清除即将如果发现有对象没有被标识为可到达对象,那么就将此对象占用的内存回收,并且将原来标记为可到达对象的标识清除,以便进行下一次垃圾回收操作。
程序员云帆哥
2022/05/12
1860
【深入理解JVM】GC垃圾回收算法
Java虚拟机——垃圾回收算法与垃圾收集器
在Java运行时的几个数据区域中,程序计数器,虚拟机栈,本地方法栈3个区域随着线程而生,随线程而灭,因此这几个区域的内存分配和回收具有确定性,不需要过多考虑垃圾回收问题,因为方法结束或者线程结束时,内存就回收了。但是方法区和堆区不一样,一个接口或者实现类所需要的内存可能不一样,一个方法的多个分支需要的内存也可能不一样,只有程序运行时才能知道创建哪些对象,这部分内存的分配和回收是动态的。
本人秃顶程序员
2019/05/02
3440
Java虚拟机——垃圾回收算法与垃圾收集器
JVM学习记录-垃圾回收算法
简述 因为各个平台的虚拟机的垃圾收集器的实现各有不同,所以只介绍几个常见的垃圾收集算法。 JVM中常见的垃圾收集算法有以下四种: 标记-清除算法(Mark-Sweep)。 复制算法(Copying)。 标记整理算法(Mark-Compact)。 分代收集算法(Generational Collecting)。  标记-清除算法 标记-清除算法是现代垃圾回收算法的思想基础,主要分为两个阶段:标记阶段和清除阶段。首先根据可达分析算法,标记处可以回收的对象,标记完成后,进行清除阶段,将标记为可回收的对象进行清除。
纪莫
2018/06/14
5710
JVM之垃圾回收算法详解
根据如何判定对象是垃圾,垃圾回收算法分为两类: 1、引用计数式垃圾收集(判定垃圾是通过引用计数器)别名:直接垃圾收集 2、追踪式垃圾收集(判定垃圾是通过GC Roots)别名:间接垃圾收集
北洋
2021/12/21
5800
JVM之垃圾回收算法详解
关于java的垃圾回收机制,下面哪些结论_java垃圾回收算法有哪些
基于以上两点,收集器应该将Java堆划分出不同的区域,然后将回收对象依据年龄等分配到不同的区域中存储。但是可能会有跨代引用,于是就有了
全栈程序员站长
2022/09/27
3790
JVM垃圾回收区域,垃圾回收算法概述
发生堆和方法区 主要发生在堆中,堆区由所有线程共享,在虚拟机启动时创建。堆区主要用于存放对象实例及数组,所有new出来的对象都存储在该区域。 少部分发生在永久代 永久代的垃圾回收主要回收两部分内容:废弃常量和无用的类。 回收废弃永久代数据与回收Java堆中的对象非常相似。以常量池中字面量的回收为例,若字符串“abc”已经进入常量池中,但当前系统没有任何String对象引用常量池中的“abc”常量,也没有其他地方引用该字面量,若发生内存回收,且必要的话,该“abc”就会被系统清理出常量池。常量池中其他的类(接口)、方法、字段的符号引用与此类似。
名字是乱打的
2022/05/13
6980
JVM垃圾回收区域,垃圾回收算法概述
JVM 垃圾收集算法
本文“垃圾收集算法”节选自《深入理解Java虚拟机:JVM高级特性与最佳实践》【作者:周志明】
smartsi
2019/08/07
3410
JVM 垃圾收集算法
java中垃圾回收机制_垃圾回收机制算法
这一小节先了解一个最基本的问题:如果确定某个对象是“垃圾”?既然垃圾收集器的任务是回收垃圾对象所占的空间供新的对象使用,那么垃圾收集器如何确定某个对象是“垃圾”?通过什么方法判断一个对象可以被回收了。
全栈程序员站长
2022/11/08
5370
java中垃圾回收机制_垃圾回收机制算法
图解Java 垃圾回收机制
  Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及 回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的 堆区。关于对象分配内存问题,笔者的博文《JVM 内存模型概述》已经阐述了 如何划分可用空间及其涉及到的线程安全问题,本文将结合垃圾回收策略进一步给出内存分配规则。垃圾回收机制的引入可以有效的防止内存泄露、保证内存的有效使用,也大大解放了Java程序员的双手,使得他们在编写程序的时候不再需要考虑内存管理。本文着重介绍了判断一个对象是否可以被回收的两种经典算法,并详述了四种典型的垃圾回收算法的基本思想及其直接应用——垃圾收集器,最后结合内存回收策略介绍了内存分配规则。
Java高级架构
2018/09/29
6160
图解Java 垃圾回收机制
相关推荐
垃圾回收算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档