JVM(4)

news2024/11/16 10:27:45

垃圾回收问题

垃圾回收算法

通过之前的学习我们可以将死亡对象标记出来了,标记出来后我们就可以进行垃圾回收操作了,在正式学习垃圾处理器之前,我们先来看一下垃圾回收器使用的几种算法.

标记-清除算法

"标记-清除"算法是基础的收集算法.算法分为"标记"和"清除"两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象.后续的收集算法都是基于这种思路加以改造并对其不足加以改进而已:

"标记-清除"算法的不足主要有两个:
1.效率问题:标记和清除这两个过程的效率都不高.

2.空间问题:标记清除后会产生大量不连续的内存碎片,内存碎片太多可能会导致以后在程序运行中需要分配较大对象时,无法找到足够连续内存而不得不提前触发另一次垃圾收集.

 

 复制算法

 "复制算法是为了解决"标记-清理"的效率问题.它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块.当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次清理掉.这样做的好处是每次都对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂的情况,只需要移动堆顶指针,按顺序分配即可.此算法实现简单,运行高效.算法的执行流程如下图:

通过复制算法这种机制确实能在一定程度上规避内存问题,但也有一定缺陷.

1.总的可用内存,变少了.

2.如果每次要复制的对象比较多,此时复制的开销比较大,需要的是当前一轮(当中,大部分对象被释放,少数对象存活,在这个时候最适合复制). 

现在的商用虚拟机(包括HotSpot都是采用这种收集算法来回收新生代)

引入概念:对象的年龄.JVM有专门的线程负责扫描/释放一个对象,如果被线程扫描的时候,可达了(不是垃圾), 年龄+1 =>在对象类中存储年龄.

 新生代中98%的对象都是"朝生暮死"的,所以不需要按照1:1的比例来划分内存空间,而是将内存(新生代内存)分为一块较大的Eden(伊甸园)空间和两块较小的Survivor(幸存者空间),每次使用Eden和其中一块Survivor(两个Survivor区域一个称为from区,另一个称为To区).当回收时,将Eden和Survivor中还存活的对象一次性复制到另一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor的空间.

当Survivor空间不够用的时候,需要依赖其它内存(老年代)机型分配担保.

HotSpot默认Eden与Survivor的大小比例是8:1,也就是说:Eden : Survivor From : Survivor To = 8:1:1.所以每次新生代的可用空间为整个新生代容量的90%,而剩下的10%用来存放回收后存活的对象.

下面来看一下具体的算法执行流程:

(1)当代码中new出一个对象,这个对象就是被创建在伊甸区的,伊甸区能有很多对象.一个经验规律:伊甸区的对象都是"朝生暮死"的,生命周期非常短.

(2)第一轮GC扫描完成之后,少数伊甸区中幸存的对象就会通过算法拷贝到生存区,后续GC扫描线程还会持续进行扫描,不仅会扫描伊甸区,也会扫描生存区的对象,生存区中也有大量对象被标记为垃圾,少数存活的,就会使用算法,拷贝到另一个生存区中.只要这个能够在生存区中继续存活,就会被复制算法,拷贝到另一个生存区中,每经过一次GC扫描,对象年龄+1

(3) 如果该对象存储在生存区中,经历了若干轮GC依然健在,JVM就会认为,这个对象生命周期大概率会很长,就把这个对象从生存区拷贝到老年代.

(4)老年代对象,也会被GC扫描,但是扫描的频次大大降低.

(5)当对象在老年代中寿终正寝的时候,JVM按标记整理的方式,进行清除.

标记-整理算法

复制收集算法在对象存活率较高时会进行比较多的复制操作,效率会变低.因此老年代一般不能使用复制算法.

针对老年代的特点,提出了一种称之为"标记-整理算法".标记过程仍与"标记-清除"的过程一致,但后续的步骤不是直接对可回收对象进行整理,而是让所有存活对象都向一端移动,然后清理掉边界以外的内存.流程图如下:

 

 分代算法

分代算法和上面讲的三种算法不同,分代算法是通过区域的划分,实现不同区域和不同的垃圾回收策略,从而实现更好的垃圾回收.就好比中国的一国两制方针一样,对于不同的情况和地域设置更符合当地的规则,从而实现更好的管理,这就是分代算法的设计思想.

当前JVM垃圾收集器采用的是"分代收集"算法,这个算法并没有新思想,只是根据对象的存活周期的不同将内存划分为几块.一般是把Java堆分为新生代和老年代.在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,因此我们采用复制算法;而老年代中对象存活率高,没有额外空间对它进行分配担保,就必须采用"标记-清理"或者"标记-整理"算法.

哪些对象会进入新生代?哪些对象会进入老年代?

新生代:一般创建的对象都会进入新生代;

老年代:大对象经历了N次(默认情况下是15次)垃圾回收依然存活下来的对象会从新生代移动到老年代.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nextjs13如何进行服务端渲染?

目录 一、创建一个新项目 二、动态获取后端数据进行服务端渲染出现的问题 三、nextjs13如何进行服务端渲染 nextjs13是nextjs的一个重大升级,一些原本在next12当中使用的API在nextjs13上使用十分不便。本文将着重介绍在nextjs13及以上版本当中进行服务端渲染的方…

Java进阶(锁)——锁分类总结,Java中常用的锁的介绍

目录 引出锁分类总结1、乐观锁2、悲观锁3、自旋锁4、可重入锁5、读写锁6、公平锁7、非公平锁8、共享锁9、独占锁10、重量级锁11、轻量级锁12、偏向锁13、分段锁14、互斥锁15、同步锁16、死锁17、锁粗化18、锁消除 Java中常用的锁synchronizedLock和synchronized的区别Reentrant…

web组态(BY组态)接入流程

技术文档 官网网站:www.hcy-soft.com 体验地址: www.byzt.net:60/sm 一、数据流向图及嵌入原理 数据流向 嵌入原理 二、编辑器调用业务流程图 三、集成前需要了解的 1、后台Websocket端往前台监控画面端传输数据规则 后台websocket向客户端监控画面…

视频记录仪_基于联发科MT6762的智能4G记录仪方案

智能记录仪采用联发科强劲八核处理器,12nm制程工艺的记录仪具便是满足这些需求的理想选择。搭载4GB32GB内存,并运行Android 11.0操作系统,这款记录仪具展现出强劲的性能表现。 首先,这款记录仪具具备优秀的视频录制功能。它能完整…

mysql python学习笔记

mysql 基础概念 1.一个表格一般包含一个主建 2.可有多个主见,叫组合主见 3.可以有foreign key 用于链接外部表格的主建 外键目的: 这个约束的目的是确保当前表中的外键列(JNO列)的值必须存在于另一个表(J’表)的主键…

kibana7.17.7 将数据导出csv文件

配置kibana文件 首先先配置kibana.yaml内容如下,这里假设我的服务器ip地址为192.168.130.128,elasticsearch的ip地址为:192.168.130.129:9200,192.168.130.130:9200: server.host: "192.168.130.128" serv…

【踩坑专栏】追根溯源,从Linux磁盘爆满排查故障:mycat2与navicat不兼容导致日志暴增

昨天遇到了一个比较奇怪的问题,就是在挂起虚拟机的时候,虚拟机提示我XX脚本正在运行,很奇怪,我没有运行脚本,为什么会提示我这个呢。今天恢复虚拟机,也提示了一下脚本的问题,而且发现Linux明显异…

尚硅谷Java数据结构--希尔排序

插入排序的问题🎈: arr{2,3,4,5,6,0,9,7,8}; 当0作为插入元素的时候,其待插入下标与原下标相差很远,需要进行多次比较和移动。 希尔排序则是先将下标相差一定距离gap的元素分为一组,进行插入排序;再逐渐将距…

利用 Python 抓取数据探索汽车市场趋势

一、引言 随着全球对环境保护意识的增强和技术的进步,新能源汽车作为一种环保、高效的交通工具,正逐渐受到人们的关注和青睐。在这个背景下,对汽车市场的数据进行分析和研究显得尤为重要。 本文将介绍如何利用 Python 编程语言,结…

TypeScript08:在TS中使用模块化

前言:tsconfig.json中的配置 一、前端领域中的模块化标准 前端领域中的模块化标准有: ES6、commonjs、amd、umd、system、esnext 二、 TS中如何书写模块化语句 TS 中,导入和导出模块,统一使用 ES6 的模块化标准。 myModule.ts &a…

喜迎乔迁,开启新章 ▏易我科技新办公区乔迁庆典隆重举行

2024年1月18日,易我科技新办公区乔迁庆典在热烈而喜庆的氛围中隆重举行。新办公区的投入使用,标志着易我科技将以崭新姿态迈向新的发展阶段。 ▲ 易我科技新办公区 随着公司业务的不断发展和壮大,为了更好地适应公司发展的需要,…

AI智能分析网关V4:抽烟/打电话/玩手机行为AI算法及场景应用

抽烟、打电话、玩手机是人们在日常生活中常见的行为,但这些行为在某些场合下可能会带来安全风险。因此,对于这些行为的检测技术及应用就变得尤为重要。今天来给大家介绍一下TSINGSEE青犀AI智能分析网关V4抽烟/打电话/玩手机检测算法及其应用场景。 将监控…

StarRocks实战——贝壳找房数仓实践

目录 前言 一、StarRocks在贝壳的应用现状 1.1 历史的数据分析架构 1.2 OLAP选型 1.2.1 离线场景 1.2.2 实时场景 1.2.3 StarRocks 的引入 二、StarRocks 在贝壳的分析实践 2.1 指标分析 2.2 实时业务 2.3 可视化分析 三、未来规划 3.1 StarRocks集群的稳定性 3…

免费音频剪辑

在数字时代,音频剪辑已成为许多职业和爱好者不可或缺的技能。无论是制作播客、教育视频、还是进行广告宣传,高质量的音频剪辑都能为作品增色不少。今天,我要为大家强烈安利一款免费且功能强大的音频剪辑工具,它绝对是你办公桌上不…

虚拟机上为AzureDevOps Server 创建用户

为DevOpsServer创建登录用户 背景虚拟机的本地用户和组去DevOps Server上添加本地用户 背景 我们有一台虚拟机,然后在上面安装了一台Azure DevOps Server,然后我们创建几个登录用户。 虚拟机的本地用户和组 首先我们登陆到虚拟机,然后我们…

HTML5:七天学会基础动画网页4

backgorund-size 值与说明 length(单位像素):设置背景图片高度和宽度,第一个值设置宽度,第二个值设置高度,如果只给出一个值,第二个是设置为auto。 percentage(百分比):以父元素的百分比来设置背景图像的宽度和高度&#xff0c…

SpringBoot 事务失效及其对应解决办法

简介 本文主要讲述Spring事务会去什么情况下失效及其解决办法 Spring 通过AOP 进行事务控制,如果操作数据库报异常,则会进行回滚;如果没有报异常则会提交事务;但是,如果Spring 事务失效,会导致数据缺失/重…

服务器git安装python包失败,如何手动下载github项目包并安装到虚拟环境中(简单易懂)

背景: 想要复现一个项目,建立好虚拟环境后,准备安装项目需要的包,故输入命令pip install -r requirements.txt requirements.txt如下图 其他包我都安装成功了,只有最后一个包失败了,是需要服务器git链接…

PFA溶样罐耐酸碱小型样品罐适用元素分析实验透明特氟龙消解瓶

PFA溶样罐,也叫PFA管形瓶、可溶性聚四氟乙烯溶样罐、消解瓶等,常用于地质地矿、地球化学、土壤微生物等样品分析消解实验,可搭配石墨消解仪、电热板使用。广泛适用于痕量分析、环境监测、重金属检测、半导体、新材料、新能源等。 规格参考&am…

【二叉搜索树】【递归】【迭代】Leetcode 700. 二叉搜索树中的搜索

【二叉搜索树】【递归】【迭代】Leetcode 700. 二叉搜索树中的搜索 二叉搜索树解法1 递归法解法2 迭代法 ---------------🎈🎈题目链接🎈🎈------------------- 二叉搜索树 二叉搜索树(Binary Search Tree&#xff…