JVM垃圾回收算法整理

news2024/9/23 19:27:09

JVM垃圾回收算法整理

  • 前言
  • 关键概念了解
  • 标记–清除算法
  • 复制算法
  • 标记–整理算法
  • 分代收集算法
  • 仰天大笑出门去,我辈岂是蓬蒿人


前言

大概内容:

jvm垃圾回收算法:
1、“标记–清除”算法;首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉所有被标记的对象。
2、复制算法;将内存划分为等大的两块,每次只使用其中的一块。
3、“标记–整理”算法;
4、分代收集算法。


关键概念了解

  • 两个概念
    • 新生代:存放生命周期较短的对象的区域。
    • 老年代:存放生命周期较长的对象的区域。
  • 相同点都在Java堆上
  • 老年代:存放新生代中经过多次回收仍然存活的对象(默认15次)。

MinorGC和FullGC的区别

MinorGC:发生在新生代的垃圾回收,因为新生代的特点,MinorGC非常频繁,且回收速度比较快,每次回收的量也很大。
FullGC:发生在老年代的垃圾回收,也称MajorGC,速度比较慢,相对于MinorGc慢10倍左右。进行一次FullGC通常会伴有多次多次MinorGC,。

标记–清除算法

  • 执行步骤:
    • 标记:遍历内存区域,对需要回收的对象打上标记。
    • 清除:再次遍历内存,对已经标记过的内存进行回收。

图解
在这里插入图片描述

  • 缺点:
    • 效率问题;遍历了两次内存空间(第一次标记,第二次清除)。
    • 空间问题:容易产生大量内存碎片,当再需要一块比较大的内存时,无法找到一块满足要求的,因而不得不再次出发GC。

复制算法

将内存划分为等大的两块,每次只使用其中的一块。当一块用完了,触发GC时,将该块中存活的对象复制到另一块区域,然后一次性清理掉这块没有用的内存。下次触发GC时将那块中存活的的又复制到这块,然后抹掉那块,循环往复。

图解
在这里插入图片描述

  • 优点:
    • 相对于标记–清理算法解决了内存的碎片化问题。
    • 效率更高(清理内存时,记住首尾地址,一次性抹掉)。
  • 缺点:
    • 内存利用率不高,每次只能使用一半内存。

改进

研究表明,新生代中的对象大都是“朝生夕死”的,即生命周期非常短而且对象活得越久则越难被回收。在发生GC时,需要回收的对象特别多,存活的特别少,因此需要搬移到另一块内存的对象非常少,所以不需要1:1划分内存空间。而是将整个新生代按照8 : 1 : 1的比例划分为三块,最大的称为Eden(伊甸园)区,较小的两块分别称为To Survivor和From Survivor。

首次GC时,只需要将Eden存活的对象复制到To。然后将Eden区整体回收。再次GC时,将Eden和To存活的复制到From,循环往复这个过程。这样每次新生代中可用的内存就占整个新生代的90%,大大提高了内存利用率。

但不能保证每次存活的对象就永远少于新生代整体的10%,此时复制过去是存不下的,因此这里会用到另一块内存,称为老年代,进行分配担保,将对象存储到老年代。若还不够,就会抛出OOM。

标记–整理算法

因为前面的复制算法当对象的存活率比较高时,这样一直复制过来,复制过去,没啥意义,且浪费时间。所以针对老年代提出了“标记整理”算法。

  • 执行步骤:
    • 标记:对需要回收的进行标记
    • 整理:让存活的对象,向内存的一端移动,然后直接清理掉没有用的内存。

图解
在这里插入图片描述

分代收集算法

当前大多商用虚拟机都采用这种分代收集算法,这个算法并没有新的内容,只是根据对象的存活的时间的长短,将内存分为了新生代和老年代,这样就可以针对不同的区域,采取对应的算法。如:

  • 新生代,每次都有大量对象死亡,有老年代作为内存担保,采取复制算法。
  • 老年代,对象存活时间长,采用标记整理,或者标记清理算法都可。

仰天大笑出门去,我辈岂是蓬蒿人

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

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

相关文章

搭建自己的SSR

Vue SSR介绍 是什么 官方文档:https://ssr.vuejs.org/Vue SSR(Vue.js Server-Side Rendering) 是 Vue.js 官方提供的一个服务端渲染(同构应用)解 决方案使用它可以构建同构应用还是基于原有的 Vue.js 技术栈 官方文档…

XXL-JOB逻辑自测及执行参数配置踩坑

概述 关于XXL-JOB的使用遇到的问题记录。对XXL-JOB不熟的,可以先参考分布式任务调度平台XXL-JOB深度实战 实战 业务DTO定义如下: Data public class AdAccountDTO {private String accountId;/*** yyyy-MM-dd HH:mm:ss*/private String startCreateT…

ThingBoard源码解析-缓存

配置 TB支持两种缓存:Caffeine和Redis,通过配置cache.type来指定使用哪种缓存。 位于 org.thingsboard.server.cache Caffeine 配置类:CaffeineCacheConfiguration Configuration ConditionalOnProperty(prefix "cache", value "t…

HTML CSS 个人网页设计 WEB前端大作业代码

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

【计算机毕业设计】7.线上花店系统maven源码

一、系统截图(需要演示视频可以私聊) 摘 要 随着互联网突飞猛进的发展及其对人们的生活产生至关重要的影响,线上购花,送货到家的购物方式受到了越来越多顾客的接受与喜爱。线上花卉小铺的设计与实现不仅可以带来更广泛的选择与实…

餐饮业如何现业绩突破性增长?

疫情反复无常,餐饮人每天都面临着极大的挑战:无法预测的关店通知、突如其来的禁止堂食命令......餐饮店客流减少,业绩下滑成为不可避免的趋势。 在这种情形下,不少餐饮老板拒绝“躺平”,上演“花式自救”:…

cpu设计和实现(数据预取)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面说过了一条指令经过cpu处理的时候需要经历几个阶段。通过实验,我们发现,哪怕是再简单的ori指令也要经历取指、译码、执…

MyBatis是什么?使用方式?

目录 前言: 一、概念讲述 1.什么是MyBatis? 2.官网网址 二、使用方式 1.pom.xml里面添加依赖包 2.新建统一配置文件(俗称数据库连接文件) 3.新建立映射文件 (俗称数据库表对应xml) 4.建立数据库表…

ArcMap中之提取影像数据边界

1、前言 手里有一些经过裁剪的不规则多边形影像数据(如图例所示),希望能批量获取该类影像的边界信息,即影像对应的面信息,边界线信息。这里我们提供一种利用镶嵌数据集Footprint图层的方法来获取,面&#…

基于Python机器学习及深度学习在空间模拟与时间预测应用

了解机器学习的发展历史、计算原理、基本定义,熟悉机器学习方法的分类,常用机器学习方法,以及模型的评估与选择;熟悉数据预处理的流程,掌握python程序包的使用;理解机器学习在生态水文中的应用,…

超实用的图片处理技巧,一分钟轻松完成图片编辑

图片想必大家都很熟悉,无论是我们平时在聊天的时候使用的表情包或者是在工作中插入的插图都属于图片,在使用图片的时候大家会遇到各种各样的问题,比如上传的图片格式不对、使用的图片尺寸太大等等,都会导致图片无法正常使用&#…

[附源码]java毕业设计医院就诊流程管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

c++旅行商问题 (暴力解)

目录一、旅行商问题简介旅行商问题问题概述问题由来二、枚举所有方案1、思路2、代码3、复杂度分析三、深度优先搜索1、思路2、代码3、复杂度分析一、旅行商问题简介 旅行商问题 TSP,即旅行商问题,又称TSP问题(Traveling Salesman Problem&am…

白盒测试与黑盒测试

白盒测试技术 白盒测试技术也称结构性测试,是一种设计测试用例的方法,一般用于分析程序的内部结构,使用该方法测试程序时测试者可以看到被测试程序,并分析其内部结构。 按照被测试测试时是否需要执行测试程序可以分为静态和动态…

RK3399平台开发系列讲解(中断篇)中断控制器驱动初始化

🚀返回专栏总目录 文章目录 一、设备树源文件1.1、gic控制器节点1.2、timer节点二、中断控制器匹配表三、中断控制器初始化3.1、函数of_irq_init3.2、函数gicv3_of_init3.3、函数gic_init_bases沉淀、分享、成长,让自己和他人都能有所收获!😄 一、设备树源文件 ARM64架构…

web前端网页制作课作业:甜甜圈蛋糕店(HTML+CSS+JavaScript)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

用DIV+CSS技术设计的水果介绍网站(web前端网页制作课作业)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

NodeJs实战-Express构建照片存储网站(2)-上传、展示文件

Express构建照片存储网站2-上传、展示文件静态资源显示图片photo页面展示文件夹下的图片上传文件增加上传页面的路由增加提交接口的路由网站效果图项目地址上一节使用的静态数据存储的图片的数据,本节增加如下功能 1–上传文件 2–展示文件 静态资源显示图片 app.…

企业微信自建应用手动授权,获取用户详细信息

开始开发 最后更新:2022/10/11 企业微信提供了OAuth的授权登录方式,可以让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。 企业应用中的URL链接(包括自定义菜单或者消息中的链接),均可…

宇视高空抛物相机配置指导

宇视高空抛物相机配置指导 登录摄像机网页界面&#xff0c;进入[配置>智能监控>智能功能]页面启用<高空抛物>功能&#xff0c;并进入高空抛物配置界面&#xff1b; 添加/删除检测规则&#xff0c;根据实际高空抛物场景和规则下发要求绘制检测区域&#xff1b; (…