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. 第十二章 学习 shell脚本之前的基础知识

    http://www.92csz.com/study/linux/12.htm [什么是shell] 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.实际上,在shell和 ...

  2. electron监听系统托盘,electron是否最小化到系统托盘

    在项目中需要判断窗口是否最小化在系统托盘上,任务栏那已经关闭,查了一晚上的api,始终找不到可以调用的方法,最后绞尽脑汁想到了一个办法,那就是在点右上角的关闭按钮时,加个全局变量,用来标识已经最小到系 ...

  3. 【leetcode】1221. Split a String in Balanced Strings

    题目如下: Balanced strings are those who have equal quantity of 'L' and 'R' characters. Given a balanced ...

  4. Linux的解压缩相关命令

    Linux的解压缩相关命令 知识点: 1.zip命令 2.tar命令 3.压缩和解压常用组合

  5. python 面向对象_1

    self #self 是相当于c++的 this指针 class Ball: def setName(self,name): self.name = name def kick(self): prin ...

  6. org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression:

    org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression:

  7. #417 Div2 Problem C Sagheer and Nubian Market (二分 && std::accumulate)

    题目链接 : http://codeforces.com/problemset/problem/812/C 题意 : 给你 n 件物品和你拥有的钱 S, 接下来给出这 n 件物品的价格, 这些物品的价 ...

  8. sh_05_函数的参数

    sh_05_函数的参数 def sum_2_num(num1, num2): """对两个数字的求和""" # num1 = 10 # nu ...

  9. 【转】Django之Model层的F对象,Q对象以及聚合函数

    转自:https://blog.csdn.net/wsy_666/article/details/86692050 一.F对象: 作用:用于处理类属性(即model的某个列数据),类属性之间的比较.使 ...

  10. Linux宝塔面板FTP无法连接的解决办法,跳坑实例

    宝塔面板的ftp无法使用解决 先检查这些内容 1.注意内网IP和外网IP 2.检查ftp服务是否启动 (面板首页即可看到) 3.检查防火墙20端口 ftp 21端口及被动端口39000 - 40000 ...