JVM垃圾收集算法之清除算法
最近看了一些大佬的博文,文中提到说:学习知识不能一味的死学滥学,在学之前要明白为什么要学这个知识,在实际的应用中怎么运用这个知识。我觉得说的很对,很多时候我学习确实是了解了这是什么原理,但是要说到实际中怎么应用确实比较难总结。但以后我也会尽量总结这个知识点有什么用。
看前总结:为什么要了解垃圾回收中清除算法的具体实现,那是因为在jvm有很多种不同的垃圾收集器,而每个垃圾收集器中运用的清除算法是不一定相同的,为此我们在具体的应用中配置jvm的参数时,要根据业务的需求来对垃圾收集器进行配置,而清除算法是考虑应用哪一种垃圾收集器的要点之一。我们要根据业务的需求选择适合的垃圾收集器。
- 在上次的博文中,我记录了常用的标记算法,今天刚好想总结一下垃圾的清除算法。注意:回收算法指的是jvm的回收器用的是什么方法回收,并不指具体的回收器。
- 标记——清除算法
定义:标记清除算法顾名思义,是指在虚拟机执行垃圾回收的过程中,先采用标记算法确定可回收对象,然后垃圾收集器根据标识清除相应的内容,给堆内存腾出相应的空间。
缺点:容易产生大量的内存碎片,可能无法满足大对象的内存分配,一旦导致无法分配对象,那就会导致jvm启动gc,一旦启动gc,我们的应用程序就会暂停,这就导致应用的响应速度变慢。
操作如图所示:

- 复制算法
定义:把内存空间分成两个维度,每次只使用其中一个空间。当开始gc的时,垃圾回收器会把相应的垃圾清除,剩下的存活对象按照顺序排列完成清理。
缺点:复制算法把有用的空间压缩了一半,因为每次只能使用一半的空间用作分配,剩下的用作gc后的分配。
操作如图所示:

- 标记——压缩算法
定义:标记压缩算法是标记清除的改进版本,当垃圾收集器把垃圾清除后,下一步还会对内存碎片进行整理,把存活对象统一的整理到一边。
缺点:虽然算法免去了内存碎片的出现和节省了空间,但这种算法需要频繁的移动对象,所以会造成gc效率的降低。
操作如图所示:

- 总结
| 标记—清除算法 | 复制算法 | 标记—压缩算法 | |
| 速度 | 中等 | 最快 | 最慢 |
| 空间开销 | 少(堆积碎片) | 通常需要两倍的空间 | 少 |
| 移动对象 | 否 | 是 | 是 |
由表格可知:
- 标记——清除算法由于速度效率不高且会产生内存碎片,在实际中也很少被垃圾收集器使用。
- 而复制算法由于它的效率较高,在经常发生GC的新生代区应用是个不错的选择,因为在新生代的存活对象一般不多,对于空间的需求不高,而且还可以通过对象提升把对象放入老年代。
- 而标记压缩算法则可以应用在GC不那么频繁的老年代,虽然效率较低,但由于GC的次数没有那么频繁、同时由于可以进行内存碎片的整理,也有利于老年代的大对象的存放。
- 没有绝对优秀的算法,只有最适合的算法,所以具体使用需要根据业务的需求而定。
JVM垃圾收集算法之清除算法的更多相关文章
- JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法
标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会 ...
- jvm系列(三):java GC算法 垃圾收集器
GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计 ...
- JVM垃圾收集算法
JVM垃圾收集 1. 判断对象是否存活 引用计数算法 对象添加一个引用计数器,每个地方引用它,计数器值加+1:当引用失效,计算器值减1:任何时刻计数器为0的对象不可能被使用.引用计数算法实现简单,高效 ...
- JVM垃圾收集规则和算法
1.垃圾收集 Garbage Collection 程序计数器.虚拟机栈.本地方法栈这三部分内存随着线程生而生,随着线程灭而自然的回收,他们的大小在编译期间就大致确定了下来,所以对这部分的回收是具备确 ...
- (转)jvm具体gc算法介绍标记整理--标记清除算法
转自:https://www.cnblogs.com/ityouknow/p/5614961.html GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”, ...
- JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
- JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
- [jvm] -- 垃圾收集算法篇
垃圾收集算法 标记-清除算法 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 缺点: 效率问题: 空间问题(标记清除后会产生大量不连续的碎片) 复制算法 它可以将内存分为大小相同 ...
- JVM学习之GC常用算法
出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪 ...
随机推荐
- [no_perms] Private mode enable, only admin can publish this module
在使用npm publish是出现了错误: npm ERR! code E403 npm ERR! 403 Forbidden - PUT https://registry.npm.taobao.or ...
- Qt :编译警告 LNK4042对象被多次指定,已忽略多余的指定 ....segmentLayout.obj
解决办法: 步骤: 1.将segmentLayout.h .segmentLayout.cpp 从工程中删除(no permanently delete),并清理工程 2.在代码文件目录重命名seg ...
- c# json序列化不包括某列
.[Newtonsoft.Json.JsonIgnore]特性:使用Newtonsoft.Json序列化时字段不会被序列化. .[System.Web.Script.Serialization.Scr ...
- 使用ps将短视频制作成gif以进行展示遇到的问题
前言 为了将我们完成的微信小程序小小易校园展示给没用过的用户进行宣传,我们选择将小程序的页面使用过程录屏并制作成GIF来进行展示.制作选择的工具经过初步尝试及对比,最终选择了Adobe Photosh ...
- 解析XML数据
在 Java 程序中读取 XML 文件的过程称为解析 XML 解析 XML 文件的方式 1) DOM 解析 (java 官方提供) 2) SAX 解析(java 官方提供) 3) JDOM 解析(第三 ...
- Qt应用开发所需
Qt判断当前操作系统? 可使用宏判断,例如: #ifdef Q_OS_MAC //mac ... #endif #ifdef Q_OS_LINUX //linux ... #endif #ifdef ...
- spark 调优(官方文档)
1.序列化 对象在进行网络传输或进行持久化时需要进行序列化,如果采用序列化慢或者消耗大量字节的序列化格式,则会拖慢计算. spark 提供了两种序列化类库 1). Java serialization ...
- POJ-动态规划-典型问题模板
动态规划典型问题模板 一.最长上升子序列(Longest increasing subsequence) 状态(最关键):f[N]为动规数组,f[i]表示从第一个字符开始,以a[i]为最后一个字符的序 ...
- mapreduce 函数入门 一
MapReduce 程序的业务编码分为两个大部分,一部分配置程序的运行信息,一部分 编写该 MapReduce 程序的业务逻辑,并且业务逻辑的 map 阶段和 reduce 阶段的代码分别继 承 Ma ...
- mybatis:updatebyexample与updateByExampleSelective
MyBatis,通常逆向工程工具生成接口和xml映射文件用于简单的单表操作. 有两个方法: updateByExample 和 updateByExampleSelective ,作用是对数据库进行 ...