最近看了一些大佬的博文,文中提到说:学习知识不能一味的死学滥学,在学之前要明白为什么要学这个知识,在实际的应用中怎么运用这个知识。我觉得说的很对,很多时候我学习确实是了解了这是什么原理,但是要说到实际中怎么应用确实比较难总结。但以后我也会尽量总结这个知识点有什么用。

  看前总结:为什么要了解垃圾回收中清除算法的具体实现,那是因为在jvm有很多种不同的垃圾收集器,而每个垃圾收集器中运用的清除算法是不一定相同的,为此我们在具体的应用中配置jvm的参数时,要根据业务的需求来对垃圾收集器进行配置,而清除算法是考虑应用哪一种垃圾收集器的要点之一。我们要根据业务的需求选择适合的垃圾收集器。

  • 在上次的博文中,我记录了常用的标记算法,今天刚好想总结一下垃圾的清除算法。注意:回收算法指的是jvm的回收器用的是什么方法回收,并不指具体的回收器。
  • 标记——清除算法

  定义:标记清除算法顾名思义,是指在虚拟机执行垃圾回收的过程中,先采用标记算法确定可回收对象,然后垃圾收集器根据标识清除相应的内容,给堆内存腾出相应的空间。

  缺点:容易产生大量的内存碎片,可能无法满足大对象的内存分配,一旦导致无法分配对象,那就会导致jvm启动gc,一旦启动gc,我们的应用程序就会暂停,这就导致应用的响应速度变慢。

操作如图所示:

  

  •  复制算法

  定义:把内存空间分成两个维度,每次只使用其中一个空间。当开始gc的时,垃圾回收器会把相应的垃圾清除,剩下的存活对象按照顺序排列完成清理。

  缺点:复制算法把有用的空间压缩了一半,因为每次只能使用一半的空间用作分配,剩下的用作gc后的分配。

操作如图所示:

  • 标记——压缩算法

  定义:标记压缩算法是标记清除的改进版本,当垃圾收集器把垃圾清除后,下一步还会对内存碎片进行整理,把存活对象统一的整理到一边。

  缺点:虽然算法免去了内存碎片的出现和节省了空间,但这种算法需要频繁的移动对象,所以会造成gc效率的降低。

操作如图所示:

  • 总结
  标记—清除算法 复制算法 标记—压缩算法
速度 中等 最快 最慢
空间开销 少(堆积碎片) 通常需要两倍的空间
移动对象 否  

由表格可知:

  1. 标记——清除算法由于速度效率不高且会产生内存碎片,在实际中也很少被垃圾收集器使用。
  2. 而复制算法由于它的效率较高,在经常发生GC的新生代区应用是个不错的选择,因为在新生代的存活对象一般不多,对于空间的需求不高,而且还可以通过对象提升把对象放入老年代。
  3. 而标记压缩算法则可以应用在GC不那么频繁的老年代,虽然效率较低,但由于GC的次数没有那么频繁、同时由于可以进行内存碎片的整理,也有利于老年代的大对象的存放。
  4. 没有绝对优秀的算法,只有最适合的算法,所以具体使用需要根据业务的需求而定。

JVM垃圾收集算法之清除算法的更多相关文章

  1. JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法

    标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会 ...

  2. jvm系列(三):java GC算法 垃圾收集器

    GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计 ...

  3. JVM垃圾收集算法

    JVM垃圾收集 1. 判断对象是否存活 引用计数算法 对象添加一个引用计数器,每个地方引用它,计数器值加+1:当引用失效,计算器值减1:任何时刻计数器为0的对象不可能被使用.引用计数算法实现简单,高效 ...

  4. JVM垃圾收集规则和算法

    1.垃圾收集 Garbage Collection 程序计数器.虚拟机栈.本地方法栈这三部分内存随着线程生而生,随着线程灭而自然的回收,他们的大小在编译期间就大致确定了下来,所以对这部分的回收是具备确 ...

  5. (转)jvm具体gc算法介绍标记整理--标记清除算法

    转自:https://www.cnblogs.com/ityouknow/p/5614961.html GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”, ...

  6. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  7. JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  8. [jvm] -- 垃圾收集算法篇

    垃圾收集算法 标记-清除算法 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 缺点: 效率问题: 空间问题(标记清除后会产生大量不连续的碎片) 复制算法 它可以将内存分为大小相同 ...

  9. JVM学习之GC常用算法

    出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪 ...

随机推荐

  1. 11-散列4 Hashing - Hard Version (30 分)

    Given a hash table of size N, we can define a hash function H(x)=x%N. Suppose that the linear probin ...

  2. 【07月01日】A股滚动市净率PB历史新低排名

    2010年01月01日 到 2019年07月01日 之间,滚动市净率历史新低排名. 上市三年以上的公司,2019年07月01日市净率在30以下的公司. 来源:A股滚动市净率(PB)历史新低排名. 1 ...

  3. 【Qt开发】Qt5.9安装

    Qt5.9安装包整合了全部资源,包括所有可选的不同版本及编译器,不用再单独下载,虽然大了点,但方便了很多.有时可能需要用VS搭配Qt来使用,但有时又想用QtCreator+mingw or QtCre ...

  4. SSL密钥协商过程分析

    一.说明 尽管做过证书生成.双向认证.SSL通信编程等事情,但一直不清楚SSL如何完成密钥交换.看网上的资料则众说纷纭,最近和朋友学习时聊到了这个问题,然后正巧上周处理客户反馈SSL版本过低时领导也想 ...

  5. cmdb知识总结

    cmdb面试 1.paramiko模块的作用与原理 2.cmdb是什么 3.为什么要开发CMDB? 4.你们公司有多少台服务器?物理机?虚拟机? 5.你的CMDB是如何实现的? 6.CMDB都用到了哪 ...

  6. WPF矢量字体图标(iconfont)

    原文:WPF矢量字体图标(iconfont) 转载:点击打开链接 步骤: 一.下载添加iconfont文件 二.添加到资源文件夹,并设置不复制,且为资源文件 三.增加FIcon.xaml文件 < ...

  7. .net core mvc启动顺序以及主要部件3-Startup

    前面分享了.net core Program类的启动过程已经源代码介绍,这里将继续讲Startup类中的两个约定方法,一个是ConfigureServices,这个方法是用来写我们应用程序所依赖的组件 ...

  8. ABP 使用cache缓存

    using Abp.Application.Services.Dto; using Abp.Runtime.Caching; using Microsoft.Extensions.Configurat ...

  9. RabbitMQ学习之Topics(5)

    上一节,我们讲了direct exchange,这节我们讲下topic exchange Topic exchange 发送到topic exchange的messages不可以有一个随意的routi ...

  10. flyway.setBaselineOnMigrate(true);

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayWrappe ...