JVM常见垃圾收集算法

JVM常见垃圾收集算法

  • 标记-清除算法
  • 复制算法
  • 标记-整理(标记压缩)算法
  • 分代收集算法
    • 新生代和老年代
    • 分代收集算法工作机制
  • 面试题:为什么分代收集算法把堆分成年轻代和老年代?

标记-清除算法

最基础的算法,分标记和清除两个阶段:首先标记处所需要回收的对象,在标记完成后统一回收所有被标记的对象。
在这里插入图片描述
它有两点不足:

  • 一个效率问题,标记和清除过程都效率不高
  • 一个是空间问题,标记清除之后会产生大量不连续的内存碎片(类似于我们电脑的磁盘碎片),空间碎片太多导致需要分配大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作。

复制算法

为了解决效率问题,出现了“复制”算法,他将可用内存按容量划分为大小相等的两块,每次只需要使用其中一块。当一块内存用完了,将还存活的对象复制到另一块上面,然后再把刚刚用完的内存空间一次清理掉。这样就解决了内存碎片问题,但是代价就是可以用内容就缩小为原来的一半。
在这里插入图片描述

标记-整理(标记压缩)算法

复制算法在对象存活率较高时就会进行频繁的复制操作,效率将降低。因此又有了标记-整理算法,标记过程同标记-清除算法,但是在后续步骤不是直接对对象进行清理,而是让所有存活的对象都向一侧移动,然后直接清理掉端边界以外的内存。这样的话效率就会降低
在这里插入图片描述

分代收集算法

分代收集是将内存划分成了新生代和老年代。分配的依据是对象的生存周期,或者说经历过的 GC 次数。对象创建时,一般在新生代申请内存,当经历一次 GC 之后如果对还存活,那么对象的年龄 +1。当年龄超过一定值(默认是 15,可以通过参数 -XX:MaxTenuringThreshold 来设定)后,如果对象还存活,那么该对象会进入老年代。

新生代和老年代

在Java8时,堆被分为两份:新生代和老年代【1:2】
在这里插入图片描述

  1. 对于新生代,内部又被分为三个区域
  2. 伊甸区Eden,新生的对象都被分配到Eden区
  3. 幸存者区survivor(分成from和to)Eden区,from区,to区分配比例【8:1:1】

分代收集算法工作机制

  1. 新创建的对象,都会先分配到Eden区,
    在这里插入图片描述

  2. 当伊甸区内存不足时,标记伊甸园与from(现阶段没有)的存活对象,将存活对象采用复制算法复制到to区域中,复制完毕后,伊甸园区和from区内存得到释放
    在这里插入图片描述

  3. 经过一段时间后伊甸园区的内存又出现不足,标记Eden区域和to区域存活的对象
    在这里插入图片描述

  4. 将Eden区域和to区域存活的对象,复制到from区
    在这里插入图片描述

  5. 当幸存区对象熬过几次回收(最多15次),晋升到老年代
    在这里插入图片描述
    在Java堆划分出不同的区域之后, 垃圾收集器才可以每次只回收其中某一个或者某些部分的区域 ——因而才有了“Minor GC”“Major GC”“Full GC”这样的回收类型的划分; 也才能够针对不同的区域安排与里面存储对象存亡特征相匹配的垃圾收集算法——因而发展出了“标记-复制算法”“标记-清除算 法”“标记-整理算法”等针对性的垃圾收集算法。

  • 新生代收集(Minor GC/Young GC): 指目标只是新生代的垃圾收集,暂停时间短(STW)。
  • 混合收集(Mixed GC): 指目标是收集整个新生代以及部分老年代的垃圾收集。 目前只有G1收集器会有这种行为。
  • 整堆收集(Full GC) :指整个新生代和整个老年代的垃圾收集,暂停时间长(STW)尽力避免Full GC
    在这里插入图片描述

面试题:为什么分代收集算法把堆分成年轻代和老年代?

  1. 系统中的大部分对象,都是创建出来之后很快就不再使用,等待被回收,比如用户获取订单数据,订单数据返给用户之后就可以释放了
  2. 老年代中会存放长期存放存活的对象,比如Spring的大部分Bean对象,在程序启动之后就不会被回收了
    在虚拟机的默认设置中,新生代大小要远小于老年代的大小

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

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

相关文章

MPI 学习-环境搭建及测试DEMO

MPI 学习-环境搭建及测试DEMO 1.网络配置2.搭建NFS服务器,用于共享数据,使每个节点看到相同的内容3.基于ubuntu22.04 docker容器,安装依赖(在计算节点上执行)4.设置免密登录(在每个计算节点的容器里执行)5.测试一:bash命令A.运行B.输出 6.测试二:简单收发测试A.代码B.编译运行C…

红队笔记8-CTF5打靶流程-CMS漏洞-多用户信息泄露(vulnhub)

目录 开头: 1.主机发现和端口扫描: 2.80端口-NanoCMS哈希密码信息泄露-后台getshell 3.提权-用户过多信息泄露 4.总结: 开头: 学习的视频是哔哩哔哩红队笔记: 「红队笔记」靶机精讲:LAMPSecurityCTF5 - 标准攻击链&#xff…

ByteTrack多目标跟踪——yolox_model代码详解

文章目录 yolox_modelYOLOPAFPNYOLOXHeadmodel损失计算初步筛选SimOTA 求解 附:网络结构Cls headCls_convsCls_preds Reg headReg_convsReg_preds Obj headObj_preds yolox_model yolox_model主要包括以下几个文件:yolox.py、yolo_pafpn.py以及yolo_head.py train时…

[AIGC] MySQL存储引擎详解

MySQL 是一种颇受欢迎的开源关系型数据库系统,它的强大功能、灵活性和开放性赢得了用户们的广泛赞誉。在 MySQL 中,有一项特别重要的技术就是存储引擎。在本文中,我们将详细介绍什么是存储引擎,以及MySQL中常见的一些存储引擎。 文…

Android Databinding 使用教程

Android Databinding 使用教程 一、介绍 Android Databinding 是 Android Jetpack 的一部分,它允许你直接在 XML 布局文件中绑定 UI 组件到数据源。通过这种方式,你可以更简洁、更直观地更新 UI,而无需编写大量的 findViewById 和 setText/…

go env 命令详解

文章目录 1.简介2.格式3.示例4.环境变量参考文献 1.简介 go env 用于查看和设置 Go 环境变量。 默认情况下 go env 输出格式为 Shell 脚本格式(如 Windows 上是 batch 文件格式)。如果指定变量名称,则只输出变量的值。 2.格式 go env [-j…

MySQL 看库大表

MySQL 看库大表 在MySQL中查看数据库中的“大表”(即数据量大的表),主要是为了识别可能影响数据库性能的表。有几种方法可以帮助你找出这些表: 通过 INFORMATION_SCHEMA 数据库 MySQL的INFORMATION_SCHEMA数据库包含了数据库的元…

M芯片 mac配置Vulkan环境报错 Xcode

报错: Ignoring file ‘/usr/local/Cellar/glfw/3.3.4/lib/libglfw.3.3.dylib’: found architecture ‘x86_64’, required architecture ‘arm64’ Undefined symbols: Linker command failed with exit code 1 (use -v to see invocation) 解决:重新安…

linux 命令行下的计算器

!!! author 文章目录 1. echo 运算器, 推荐2. bc 计算器, 不推荐3. dc 计算器, 不推荐4. awk计算器. 推荐5. python. 推荐 1. echo 运算器, 推荐 限制是仅能在整数运算时使用 $ echo $((10534)) 70 优点,输入简洁, 支持运算表达式,支持16进制,10进制混合输入. 缺点,不支持浮点…

申请GeoTrust数字证书

GeoTrust介绍: 大家应该都不陌生,作为最老资格的一批国际大牌证书,GeoTrust的品牌效益和使用群体非常庞大。在数字证书领域也是当之无愧的龙头地位,作为Symantec和Digicert的子品牌,证书安全性能方面毋庸置疑&#xf…

IP SSL证书注册流程

使用IP地址申请SSL证书,需要用公网IP地址申请,申请之前确保直接的IP地址可以开放80或者443端口两者选择1个就好,端口不需要一直开放,只要认证的几分钟内开放就可以了,然后IP地址根目录可以上传txt文件。 IP SSL证书认…

搭建服务器 - 笔记

1 nginx web服务架构-CSDN博客 大型网站技术架构设计 百度安全验证 2.log分析 GitHub - compilelife/loginsight: loginsight致力于打造一款日志分析的利器 3 远程共享本地知识库 Linux CentOS系统Docker部署Wiki.js并实现远程共享本地知识库 百度安全验证 4 Python 编…

Codeforces Round 800 (Div. 1)C. Keshi in Search of AmShZ 反向dijkstra,并附带权值

Problem - C - Codeforces 目录 题意: 思路: 答疑: 1.为什么反向做呢? 2.为什么是到达点的剩余度数呢? 3.相同路是否可以去重,用个set? 4.如果有多条路相同呢? 参考代码&am…

【SecretFlow——SPU基础】

1.SPU基础 SPU设备在SecretFlow中负责执行MPC计算。 2.代码解读 2.1 创建设备 import secretflow as sf # 如果存在secretflow,先关闭已经存在的环境 sf.shutdown() # 初始化四个参与方 sf.init([alice, bob, carol, dave], addresslocal) # 寻找未占用的端口来…

【YOLOV5 入门】——detect.py简单解析模型检测基于torch.hub的检测方法

声明:笔记是毕设时根据B站博主视频学习时自己编写,请勿随意转载! 一、打开detect.py(文件解析) 打开上节桌面创建的yolov5-7.0文件夹里的detect.py文件(up主使用的是VScode,我这里使用pycharm…

使用vue根据表格内容生成Excel表格并下载

安装file-saver npm install file-saver -S 安装 xlsx npm install xlsx -S 按照element npm i element-ui -Smian里引入element import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css;在页面引入file-saver以及 xlsx import FileSaver …

NLP深入学习:结合源码详解 BERT 模型(三)

文章目录 1. 前言2. 预训练2.1 modeling.BertModel2.1.1 embedding_lookup2.1.2 embedding_postprocessor2.1.3 transformer_model 2.2 get_masked_lm_output2.3 get_next_sentence_output2.4 训练 3. 参考 1. 前言 前情提要: 《NLP深入学习:结合源码详…

PyQt5开发——QCheckBox 复选框用法与代码示例

1. 复选框 QCheckBox 是 Qt 框架中的一个控件,用于在界面中表示一个可以被选中或取消选中的复选框。它通常用于允许用户在多个选项之间进行选择。在 Python 中使用 PyQt 或 PySide 开发 GUI 应用程序时,可以使用 QCheckBox 控件来实现复选框。 2.基本用…

UML类图箭头表示含义:

UML类图箭头表示含义: uml图六种箭头的含义(泛化、实现、依赖、关联、聚合、组合)_组合和聚合的箭头-CSDN博客

[ Linux ] git工具的基本使用(仓库的构建,提交)

1.安装git yum install -y git 2.打开Gitee,创建你的远程仓库,根据提示初始化本地仓库(这里以我的仓库为例) 新建好仓库之后跟着网页的提示初始化便可以了 3.add、commit、push三板斧 git add . //add仓库新增(变…