JVM:垃圾回收机制(GC)

垃圾判断:

  1. 引用计数算法:

        在对象中添加一个引用计数器,当每有一个地方引用它时,计数器值加一。当引用失效时,计数器值就减一。当一个对象的计数器为零时,表示该对象没有被任何其他对象引用,因此可以被释放。

  • 优点:是可以及时回收垃圾对象,避免内存泄漏,且不会产生暂停时间。
  • 缺点:维护计数器会增加额外的开销。无法处理循环引用的情况,即两个或多个对象互相引用,导致它们的计数器永远不为零,无法被回收。主流的Java虚拟机里面都没有选用引用计数算法来管理内存。
  1. 可达性分析算法:

        通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。

GC Roots:虚拟机栈中引用的对象、在方法区中类静态属性引用的对象、在方法区中常量引用的对象、在本地方法栈中JNI引用的对象、所有被同步锁持有的对象。

图中虽然object4、object5、object6之间有互相引用,但它们到GC Roots不可达,所以它们被判定为可回收对象。

再介绍一下引用的区别:

  • 强引用:最常见的引用类型,就是new出来的对象。只要有强引用指向对象,对象就不会被垃圾回收器回收。
  • 软引用:只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存, 才会抛出内存溢出异常。
  • 弱引用:被弱引用关联的对象只 能生存到下一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只 被弱引用关联的对象。
  • 虚引用:一个对象是否有虚引用的 存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。

垃圾回收算法:

再将回收算法前我们需要了解两个假说:

  • 弱分代假说:绝大多数对象都是朝生夕灭的。
  • 强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。

这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:收集器应该将Java堆划分 出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。

1、标记清除算法

        这个算法正如他的名字一样,算法分为“标记”和清除两个阶段。先把需要清除的对象进行标记,再标记完成后,统一回收掉所有被标记的对象,也可反过来,标记存活的对象,统一回收所有未被标记的对象。这是最基础的收集算法,后续大多数的收集算法都是以标记清除算法为基础。

缺点:第一个执行效率不稳定,如果有大量的对象需要清除,那么要进行大量的标记和清除,效率随回收对象的增长而降低(所以比较适合老年代)。第二个内存空间会存在碎片化问题,使其原本有足够大空间,但由于太过碎片化无法存大对象,从而不得不提前触发垃圾收集。

2、标记复制算法

        这个算法主要是用来解决当有大量需要回收的对象时效率低下的问题。标记的不要回收的对象,但我们要操作的是不需要回收的对象,此时我们所需要的时间就会少很多。这个方法则是半区复制法。我们将内存等半分,每次只使用一块,当第一快内存用完之后,只要将还存活的对象复制到第二块去,然后将第一块内存清空。这样往复操作。这个操作简单高效,还解决了内存碎片化问题。缺点就是每次内存只能使用一半,太过于浪费。

现在好多JVM大多使用这样是收集算法去回收新生代,但是并不是1:1的比例,而是将其划分为  Eden(8):Survivor(1):Survivor(1),每次分配内存只使用Eden和其中一块Survuvor,当发生垃圾收集时,将这个块Survuvor和Eden中存活的对象复制到空闲那块Survuvor上去,然后之间清空这个块Survuvor和Eden。这个比例是通过测试得来的合理分配。这样一来才浪费了10%的内存。可以接受。当然如果出现了某次意外,一个Survivor无法存放所有的存活对象,可以向老年代“借”内存用来存放。

3、标记整理算法

标记整理算法就是将需要回收的对象标记然后清除,最后将存活下来的对象进行整理。这样子即利用了100%的内存空间,又解决内存碎片化问题。但是如果是向老年区这个每次清除都有大量的对象存活的区域,那么移动对象也是很大的负担。所以一般都是先进行标记清除算法,待碎片化太过于严重再使用一次标记整理算法,解决碎片化。这样的方式被CMS收集器使用着。

ps:移动过程中要停止用户线程。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/414537.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rust跟我学六:虚拟机检测

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎么检测是否在虚拟机里运行的。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:…

酷开科技将AR技术多方应用 打造全能酷开系统

酷开系统AR技术的核心是通过计算机视觉、图形渲染和深度感知等技术,将虚拟物体或信息精确地叠加到现实世界的场景中。通过智能摄像头捕捉真实环境的图像和视频,结合3D渲染技术,生成与现实场景相融合的虚拟图像,实现虚实结合的视觉…

【GNN】人大魏哲巍“青源Talk”图机器学习

目录 简介 图学习历史与应用 历史-哥尼斯堡七桥问题 图历史发展介绍 图神经网络 应用(!!) 图学习近期工作 概况 图卷积神经网络(ICML,NIPS,KDD) 大规模图神经网络&#xf…

分类预测 | Matlab实现KPCA-EBWO-SVM分类预测,基于核主成分分析和改进的白鲸优化算法优化支持向量机分类预测

分类预测 | Matlab实现KPCA-EBWO-SVM分类预测,基于核主成分分析和改进的白鲸优化算法优化支持向量机分类预测 目录 分类预测 | Matlab实现KPCA-EBWO-SVM分类预测,基于核主成分分析和改进的白鲸优化算法优化支持向量机分类预测分类效果基本描述程序设计参…

Mysql深度分页优化的一个实践

问题简述: 最近在工作中遇到了大数据量的查询场景, 日产100w左右明细, 会查询近90天内的数据, 总数据量约1亿, 业务要求支持分页查询与导出. 无论是分页或导出都涉及到深度分页查询, mysql通过limit/offset实现的深度分页查询会存在全表扫描的问题, 比如offset1000w, limit10…

k8s的坑,从这里开始

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 以前刚接触k8s时踩了不少坑,比如这些: 问题1 1、在master节点使用kubectl命令时,报错&…

TypeScript实现一个贪吃蛇小游戏

游戏效果 文件目录 准备1&#xff1a;新建index.html&#xff0c;编写游戏静态页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-…

ubuntu源码安装MySQL

mysql下载路径 创建新数组 mysql sudo groupadd mysql# 创建用户 mysql ,指定属组为 mysql&#xff0c;禁止其登录 # --no-create-home选项&#xff0c;创建用户时不会自动创建主目录 sudo adduser --system --no-create-home --ingroup mysql --shell /sbin/nologin mysql创…

CC工具箱使用指南:【三调_土地利用现状分类面积汇总表(竖版)】

一、简介 之前做了一个统计三调土地利用现状分类面积汇总表的工具。 汇总表的格式采用《TDT 1055-2019 第三次全国国土调查技术规程》的附表2&#xff0c;使用的是横版的表格。 但是有小伙伴反映需要竖版的的统计表格&#xff0c;于是就做了这么一个衍生工具。 表格长这样&…

vue3自定义按钮点击变颜色实现(多选功能)

实现效果图&#xff1a; 默认选中第一个按钮&#xff0c;未选中按钮为粉色&#xff0c;点击时颜色变为红色 利用动态类名&#xff0c;当定义isChange数值和下标index相同时&#xff0c;赋予act类名&#xff0c;实现变色效果 <template><div class"page"&…

表单验证 ---- 在Vue2中使用ElementUI进行表单验证

目录 前言 给表单绑定对应属性 在data中定义数据对象和表单的定义规则 与数据对象双向绑定 对整个表单进行验证 前言 在做项目时&#xff0c;对于表单进行验证是我们必不可少的 例如 搭建一个基本的登录界面 <div class"form"><h1>登录</h1>&…

即时按需原子 CSS 引擎:比 Tailwind JIT 快 5 倍! | 开源日报 No.149

unocss/unocss Stars: 14.6k License: MIT 该项目是一个即时的按需原子 CSS 引擎&#xff0c;受到 Windi CSS、Tailwind CSS 和 Twind 的启发&#xff0c;解决了定制化、速度和体积的问题。 以下是该项目的特点和核心优势&#xff1a; 完全可定制&#xff1a;通过预设提供所…