GC回收算法

1.标记清除算法
分为标记阶段和清除阶段
标记阶段:通过特定的判断方式找出无用的对象实例并将其标记
清除阶段:将已标记的对象所占用的内存回收
缺点:运行多次以后容易产生空间碎片,当需要一整段连续内存时虽然空间足够但是无法分配,会多次触发GC操作。

2.复制算法
为了提高标记清除算法的效率,减少内存碎片的产生而出现的,该算法将内存空间分为两个完全相同的两部分,每次只使用其中的一部分。
分为标记阶段、复制阶段和清除阶段
标记阶段:同标记清除算法的标记阶段一致
复制阶段:将为标记的对象全部复制到另一块未使用的空间中
清除阶段:将已标记对象所在空间全部清除
缺点:虽然解决了空间碎片的问题, 但是内存使用量变为了当前内存的一半

3.标记整理算法
为了解决复制算法只能使用一半内存的情况
分为标记阶段、整理阶段、清除阶段
标记阶段:同标记清除算法的标记阶段一致
整理阶段:将未被标记的对象全部移动到固定的一端,将所有存活的对象整齐的排列在内存的一端
清除阶段:将未被标记的对象的另一块区域清空

4.分代收集算法
根据对象存活周期的不同将内存划分为新生代区域和老年代区域,在新生代中的对象生存时间短,通常为朝生夕死类型,老年代中的对象通常存活的时间都很长。
根据新生代中对象的类型采用改进的复制算法进行垃圾收集,将新生代分为Eden区和两个大小相等的Servior区,它们的比例默认为8:1,每次只使用Eden区和其中一个Servior区,垃圾收集时将未标记的对象移入到另一个Servior区。
根据老年代对象的类型采用标记整理算法。
此算法是目前HotSpot虚拟机中默认使用的算法。

GC收集器

新生代

1.Serial收集器
是一个单线程收集器,会出现Stop The World,即该收集器运行时会暂停其他所有线程。
适用于客户端模式下的虚拟机

2.ParNew收集器
是Serial收集器的多线程版本
适用于Server模式下的虚拟机
默认开启的收集线程数和CPU核数相同

3.Parallel Scavenge收集器
类似于ParNew收集器,其更关注于吞吐量
是通过调小新生代空间来实现控制吞吐量的操作
默认提供自适应的调节策略

老年代

1.Serial Old收集器
特性同Serial收集器相同
因为是在老年代,使用的收集算法为标记整理算法

2.Parallel Old收集器
特性同Parallel Scavenge收集器相同,是Parallel Scavenge收集器的老年代版本
使用标记整理算法

3.CMS收集器
分为初始标记、并发标记、重新标记和并发清除阶段
初始标记阶段:此阶段标记GCRoots直接关联的对象,需要停止所有线程
并发标记阶段:同用户线程一起工作,更正标记的对象
重新标记阶段:修正并发标记阶段因用户操作导致的变化
并发清除阶段:同用户线程一起工作,清除垃圾
缺点:对资源敏感,无法处理浮动垃圾
默认开启的线程数为(CPU数量+3)/4

4.G1收集器(新生代和老年代通用)
分为初始标记、并发标记、最终标记和筛选回收阶段
初始标记阶段:此阶段标记GCRoots直接关联的对象,需要停止所有线程
并发标记阶段:从GC Roots开始进行可达性分析,与用户线程一起工作
最终标记阶段:修正在并发标记阶段用户操作导致的变化
筛选回收阶段:使用多线程的方式清除垃圾
特点:G1收集器将内存分为了多个大小相同的Region,虽然还存在分区的概念,但是已经不是物理上隔离了,它们都是一部分Region的集合
名字的由来:优先回收价值最大的Region

各个收集器的搭配情况

 注:Hot Spot 虚拟机用的就是 分代收集算法,在新生代中用的是改进的复制算法,主要涉及的收集器(Serial收集器、ParNew收集器、Parallel Scavenge收集器以及G1收集器),在老年代中用的是标记整理算法,主要涉及的收集器(Serial Old收集器、Parallel Old收集器、CMS收集器、G1收集器)。

原文地址:https://blog.csdn.net/luffysk/article/details/82730058

java虚拟机学习总结之GC回收算法与GC收集器的更多相关文章

  1. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

  2. 【JVM从小白学成大佬】4.Java虚拟机何谓垃圾及垃圾回收算法

    在Java中内存是由虚拟机自动管理的,虚拟机在内存中划出一片区域,作为满足程序内存分配请求的空间.内存的创建仍然是由程序猿来显示指定的,但是对象的释放却对程序猿是透明的.就是解放了程序猿手动回收内存的 ...

  3. JVM虚拟机学习一:垃圾回收算法总结

    1.java虚拟机中涉及到的数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某 ...

  4. (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

  5. JVM学习(三):垃圾回收算法

    局部性原理和分代回收思想 大学学习操作系统或者计算机组成原理的时候都提到一个重要概念,叫局部性原理. 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小 ...

  6. java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  7. 深入理解java虚拟机学习笔记(二)垃圾回收策略

    上篇文章介绍了JVM内存模型的相关知识,其实还有些内容可以更深入的介绍下,比如运行时常量池的动态插入,直接内存等,后期抽空再完善下上篇博客,今天来介绍下JVM中的一些垃圾回收策略.        一. ...

  8. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  9. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

随机推荐

  1. python学习理论

    结论 其实学python这本书 不一定要全部敲一遍 在“”动手试一试“”里面 把这篇学到的东西测试一下就算是掌握了 要在实际工作场景当中使用还需要进一步练习这样做的话 比较好一点 边学边测试 加深掌握 ...

  2. react样式

    https://www.jianshu.com/p/711c596571d6(copy)

  3. POJ 2186 挑战 --牛红人 强连通分量——Tarjan

    题意:n头奶牛,给出若干个欢迎关系a b,表示a欢迎b,欢迎关系是单向的,但是是可以传递的,如:a欢迎b,b欢迎c,那么a欢迎c .另外每个奶牛都是欢迎他自己的.求出被所有的奶牛欢迎的奶牛的数目.#i ...

  4. PKUWC2020爆零记

    抱歉,这么晚才更. 事实是:我都没有去 所以爆零了 QwQ

  5. jQuery_完成省市二级联动

    当填表的时候会让你设计某省某市怎么设计,应该明白,如果你选择了一个确定的省,那么在第二个下拉框内则不会有除了你选择的省的市之外的名称.而这功能用js来实现很麻烦,但是用jq确很容易实现. 原表结构: ...

  6. 消息 15135,级别 16,状态 8,过程 sp_addextendedproperty,对象无效。不允许有扩展属性,或对象不存在。

    不知道网上为啥有那么多复制粘贴的文章,写点原创不好吗?堂而皇之的贴别人的文章有意思吗? 消息 15135,级别 16,状态 8,过程 sp_addextendedproperty,对象无效.不允许有扩 ...

  7. nginx typecho config

    ## # You should look at the following URL's in order to grasp a solid understanding # of Nginx confi ...

  8. Comparable接口与Comparator接口的比较————总结

    之前的两篇文章主要学习了Comparable接口和Comparator接口的学习.既然已经学习完了,现在就趁热打铁,进行总结吧! Comparable接口和Comparator接口的共同点: 1. 都 ...

  9. php数组合并用加号(+)和用array_merge()的区别

    结论:用加号合并数组:既考虑数字索引的键值对,也考虑字符串索引的键值对,用前边数组的值覆盖后边的键名相同的值; 用array_merge()合并数组:只考虑字符串索引的键值对,用后边数组的值覆盖掉前面 ...

  10. learning webrtc 使用node.js

    第二章 有使用node.js创建静态服务器的步骤 不过不够详细 下面以Windows为例 1.到官方网站下载安装包 然后安装 2.用管理员权限启动命令行 3.命令行窗口执行npm config set ...