一.题记

Java垃圾回收器的概念看完一遍总是不能深入的理解和记忆,本文主要是对读完《深入理解java虚拟机》一书的整理,以便后续复习之用。

二.概述

1.GC概念

在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾收集也可以清除内存记录碎片。由于创建对象和垃圾收集器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。

2.GC算法

对于垃圾回收可以从基本回收策略、分区对待方式、系统线程进行划分。

(1).基本回收策略

1).引用计数器(Reference Counting)

说明:引用计数器是垃圾收集器早期的算法,是唯一没有使用根级的垃圾回收法,通过使用引用计数器来区分存活对象和不再使用的对象,通常堆中的每个对象都会对应一个引用计数器,当每次创建一个对象并指向其引用被赋给一个变量时,该对象的引用计数器被设置为1。以后每当其引用被赋值给一个不同的变量时,该对象的引用计数就加1,当对象丢弃不在使用既出了作用域,该对象的引用计数器减1。任一对象一旦其引用计数器为0,对象就满足了垃圾回收条件。

优点:引用计数收集器算法简单,适于做增量收集,对于程序不能被长时间打断的实时环境特别适合,另外,收集过程也有助于改进引用局部性。

缺点:(1).无法处理循环引用的问题既两个或多个对象之间相互引用,因为它们的引用计数永远不会为0。(2).每次增减引用计数都带来额外开销,而且该算法还需要编译器的高度配合。

2).标记-清除(Mark-Sweep)

说明:垃圾收集过程执行分两阶段。在标记阶段,垃圾收集器遍历引用树,标记每一个遇到的对象。在清理阶段,未被标记的对象被释放,相应内存被返还待用,此算法需要暂停整个应用。

优点:可以轻易回收循环结构,而且不存在为维护引用计数而付出的额外开销和对编译器的依赖。

缺点:(1).在清理阶段,堆中的所有对象,不论是否可达,都会被访问。一方面这对于可能有页面交换的堆所依赖的虚存系统有着非常负面的性能影响;另一方面,因为其中很大一部分对象可能是垃圾,这就意味着垃圾收集器把大量精力都花费在检查和处理垃圾上面了。无论从哪个角度来看,该算法都可能产生收集暂停时间过长、收集开销偏大的问题。(2).标记并清理收集器的另一个不足是它容易导致堆的碎片化,从而引发引用局部性或者大对象分配失败等方面的问题。

3).标记-整理(Mark-Compact)

说明:标记并清理收集器结合了"标记-清除"和"复制"两个算法的优点,分为两个阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象"压缩"到堆的其中一块,按顺序排放。

优点:此算法避免了"标记-清除"算法的碎片问题,同时也避免了"复制"算法的空间问题。

4).复制(Copying)

说明:复制的收集算法将可用内存按容量划分为大小相等的两块,每次只是用其中一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

优点:复制的收集算法每次都是对其中的一块进行内存回收,没存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。

缺点:需要两倍内存空间。

(2).分区对待方式

1).增量收集(Incremental Collecting)

说明:实时垃圾回收算法,即在应用进行的同时进行垃圾回收。

2).分代收集(Generational Collecting)

说明:基于对对象生命周期分析后得出的垃圾回收算法。把对象分为新生代、老年代、持久代,对不同生命周期的对象使用不同的算法进行回收。

备注:在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那么就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记-清理或标记-整理算法来进行回收。

(3).系统线程

1).串行收集

说明:串行收集使用单线程处理所有垃圾回收工作。

优点:无需多线程交互,实现容易,而且效率比较高。

缺点:会产生系统停顿,单线程。

适用情况:数据量比较小(100M左右),单处理器下并且对响应时间无要求的应用。

2).并行收集

说明:并行收集使用多线程处理垃圾回收工作。

优点:速度快,效率高,理论上CPU数目越多,越能体现出并行收集器的优势。

缺点:会产生系统停顿,多线程,可以限制线程数量。

适用情况:"对吞吐量有高要求",多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。

3).并发收集

说明:可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间。

优点:不会产生系统停顿,多线程,可以一个线程也可以和应用程序一起组成多线程。

适用情况:"对响应时间有高要求",多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。

Java常见的垃圾收集器GC算法整理相关推荐

  1. java eden space_《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读...

    堆内存使用分析,垃圾收集器 GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建.一些类信息,常量,静态变量等存储在方法区.堆和方法区都是线程共享的. GC机制是由JVM提供,用来清理需要 ...

  2. 深入理解Java垃圾回收——垃圾收集器

    <深入理解Java垃圾回收--虚拟机高效回收的背后>讲述了垃圾回收的理论思想,本篇文章来深入了解垃圾回收的实践:垃圾收集器. 在讲解垃圾收集器之前必要要统一几点认知: 1.用户线程:执行应 ...

  3. java中的垃圾收集器_Java中的垃圾收集

    java中的垃圾收集器 Garbage collection in java is one of the advance topic. Java GC knowledge helps us in fi ...

  4. 深入理解 Java G1 垃圾收集器GC调优

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

  5. Java常用的垃圾收集器_JVM垃圾收集算法及常用垃圾收集器

    程序计数器.虚拟机栈.本地方法栈随线程而生随线程而灭,栈帧分配多少内存在类结构确定后就确定了.垃圾回收针对的是Java堆和方法区. 一:对象已死吗 在垃圾收集器进行回收前,第一件事就是确定这些对象哪些 ...

  6. Java虚拟机(三)--------GC算法和收集器

    如何判断对象可以被回收 堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的 对象) 引用计数法 给对象添加一个引用计数器,每当有一个地方引用,计数器 ...

  7. 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一

    Grabage Collection      GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...

  8. Java中常见的垃圾收集器

    串行垃圾回收器(Serial 收集器) 单线程的垃圾回收器,在垃圾回收时,需要其它线程暂停,等待垃圾回收完毕. 开启串行垃圾回收器的参数:-XX:+UseSerialGC = serial + ser ...

  9. 《深入理解java虚拟机》笔记2——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

  10. Java虚拟机04——垃圾收集器

    主要介绍HotSpot虚拟机的垃圾收集器,这个虚拟机包含的所有收集器如图所示: 可以看到,收集器之间是可以搭配使用的.下面介绍这些收集器的特性.基本原理和使用场景.在介绍之前先明确一个观点:直到现在为 ...

最新文章

  1. tcpdump 命令的个常用选项:一
  2. JGG:中大骆观正组开发微量样品m(6)A测序新技术
  3. java红黑树_JAVA学习-红黑树详解
  4. linux修改文件权限属性,如何修改Linux文件的属性与权限
  5. Html做网络硬盘系统交互,教你做网络硬盘(上)
  6. python机器学习库xgboost——xgboost算法(有分类和回归实例)
  7. 设置新生代与老年代比例关系
  8. CentOS7 安装 Jenkins( 构建 Vue 和 dotNET Core )
  9. arthas 查看哪个方法调用最耗时_Java开源诊断工具Arthas使用方法详解
  10. 深度学习《CNN架构续篇 - 梯度下降的优化》
  11. 一加将于10月14日推出新款Buds系列真无线耳塞
  12. 顶饰条行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  13. Hive External Table of Doris(详细)
  14. 三步教会你在solidworks中画铝型材
  15. 五险一金 | 养老保险及其退休金计算
  16. 小米A1(小米5X国际版)刷机完全指南
  17. 前辈不是我,借他人事迹助暖通新人!
  18. oracle数据库期末上机题,oracle数据库期末考试试题及复习资料
  19. [WinError 206] 文件名或扩展名太长(组策略值修改 解除windows文件名 字符长度限制)
  20. 从P1到P7——我在淘宝这7年转载

热门文章

  1. Unix 网络编程 I/O 模型 第六章
  2. c#2.0语法新关键字 partial
  3. Lumen开发:lumen源码解读之初始化(5)——注册(register)与启动(boot)
  4. Java基础学习,一些零散的笔记之抽象类与接口
  5. NSTimer的使用
  6. C++primer plus第六版课后编程题答案 6.6
  7. WebService为手机开发提供服务
  8. ZED双目摄像头 Ubuntu18.04 + ROS melodic + opencv3.4.0 + Cuda10.2 + ZED SDK 3.5.6
  9. 反射ModelToDto
  10. pandas把'm8[ns]'类型转换为int类型进行运算