IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> JVM的回收算法和主流的垃圾回收器 -> 正文阅读

[数据结构与算法]JVM的回收算法和主流的垃圾回收器

概述

在JVM中,我们的堆和元空间都是线程共享的,所以我们可能存在当堆空间的容量不支持存放新的对象的时候,就会触发垃圾回收机制,那么,回收的时候是根据什么情况回收的呢。

怎么判断该对象是灭亡状态

引用计数法:
概述:对象中添加一个引用计数器,如果引用计数器为0则表示没有其它地方在引用它。如果有一个地方引用就+1,引用失效时就-1。
缺点:实际上在大部分Java虚拟机中并没有采用这种算法,因为它会带来一个致命的问题—对象循环依赖。对象A指向B,对象B反过来指向A,此时它们的引用计数器都不为0,但它们俩实际上已经没有意义因为没有任何地方指向它们。
可达性分析算法:(主流的使用这个)
概述:根节点是一个称为GC Roots的对象,从这个对象开始向下搜索并作标记,遍历完这棵树过后,未被标记的对象就会判断“已死”,即为可被回收的对象。
哪些可以作为根节点的GCroot对象呢
1.虚拟机栈中引用的对象。
2.方法区中类静态属性实体引用的对象。
3.方法区中常量引用的对象。
4.本地方法栈中JNI引用的对象

回收算法

1.标记清除算法
如图所示:假设红色是可回收对象,绿色是回收之后的对象的引用空间,当被GC回收之后,我们可以发现空间是不连续的,而且每个对象的大小不相等,那我就会发生一种情况,当我们创建一个对象,假设所有的空间大小都不支持存放的话,就会提前触发GC。
在这里插入图片描述
在这里插入图片描述
缺点:
1.标记和清除的过长较长,效率不高。
2.产生大量不连续的碎片,空间利用率不高,可能提前触发GC。

2.标记整理算法

如图所示:假设红色是可回收对象,绿色是回收之后的对象的引用空间,当我们触发GC的时候,首先我们会把可用的对象整理在一起,回收的对象整理在一起,然后再把回收的对象回收。对象的引用地址可能发生变化,短暂造成STW。
在这里插入图片描述在这里插入图片描述
优点:空间利用率高,没有碎片化。
缺点:STW,短暂卡顿现象。

3.标记复制算法
概述:红色代表可回收对象,绿色代表可用对象,当我们触发GC的时候,我们会把可用对象整体复制到to区,然后直接清除整块的from区。
在这里插入图片描述
优点:效率高,空间连续性
缺点:以空间换时间,也会造成STW

4.0 分代算法:
概述:Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,使用标记整理算法来进行回收。
在这里插入图片描述

垃圾回收器

新生代收集器:Serial、ParNew、Parallel Scavenge
老年代收集器:CMS、Serial Old、Parallel Old
整堆收集器: G1
1.Serial收集器是最基本的、发展历史最悠久的收集器。
参数控制:-XX:+UseSerialGC 串行收集器
特点:单线程、简单高效(与其他收集器的单线程相比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程手机效率。收集器进行垃圾回收时,必须暂停其他所有的工作线程,直到它结束(Stop The World)。
2.ParNew收集器其实就是Serial收集器的多线程版本。
参数控制:-XX:+UseParNewGC ParNew收集器
特点:多线程、ParNew收集器默认开启的收集线程数与CPU的数量相同。
3.Parallel Scavenge 收集器与吞吐量关系密切,故也称为吞吐量优先收集器。
参数控制:-XX:+UseParallelGC 使用Parallel收集器+ 老年代串行
特点:属于新生代收集器也是采用复制算法的收集器,又是并行的多线程收集器(与ParNew收集器类似)
4.Serial Old 收集器 Serial Old是Serial收集器的老年代版本。
参数控制:-XX:+UseParallelOldGC使用Parallel收集器+ 老年代并行
特点:同样是单线程收集器,采用标记-整理算法。
5.Parallel Old 收集器是Parallel Scavenge收集器的老年代版本。
特点:多线程,采用标记-整理算法
6.CMS收集器一种以获取最短回收停顿时间为目标的收集器。
核心理念:减少stw时间。使用标记整理的话,stw时间会变长,违背设计理念。虽然有碎片化问题,但是用户不会阻塞
特点:基于标记-清除算法实现。并发收集、低停顿。
收集过程:
初始标记 :标记GCroot直接关联的对象,也会stw,速度很快
并发标记:初始标记结束后,线程就会启动,同时多线程并发标记与初始标记相关的链 (用户线程与GC线程一起运行
重新标记:修正标记,当并发标记时,用户线程也在启动,会导致GCroot的引用链发生变动。 也会stw
并发清除:使用标记清除算法清除,
图片来源于网络:
在这里插入图片描述
CMS收集器的优点:
1.STW时间短
2.用户线程和GC同时运行
CMS收集器的缺点:
1.对CPU资源非常敏感。
2.由于在使用并发清除的时候,GC线程和用户线程是同时运行的,所以可能禅城无法处理的浮动垃圾,可能出现Concurrent Model Failure失败而导致另一次Full GC的产生。
3.因为采用标记-清除算法所以会存在空间碎片的问题,导致大对象无法分配空间,不得不提前触发一次Full GC
并发清除时,碎片化很多,会发生什么问题:
直接触发FullGC ,采用串行老年化GC清理整个堆内存垃圾(标记整理算法),导致所有用户线程等到。

jvm收集器这块还没有总结到位,后面补充!!!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-06 15:30:49  更:2021-12-06 15:32:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:50:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码