JVM学习-垃圾回收(二)

标记-清除(Mark-Sweep)算法

当堆中的有效内存空间被耗尽的时候,就会停止整个程序(stop the world),然后进行两项工作,第一项则是标记,第二项是清除

  • 标记:Collector从引用根节点开始遍历,标记所有被引用的对象。一般是在对象的Header中记录为可达对象
  • 清除:Collector对堆内从头到尾进行线性的遍历,如果发现某个对象在其Header中没有标记为可达对象,则将其回收。
  • 缺点
    • 效率不算高
    • 在进行GC的时候,需要停止整个应用程序,导致用户体验差
    • 这种方式清除出来的空闲内存是不连续的,产生内存碎片,需要维护一个空闲列表
  • 何为清除
    • 这里所谓的清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表里,下次有新对象需要加载时,判断垃圾的位置空间是否够,如果够,就存放
      在这里插入图片描述
复制算法

将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。

  • 优点
  • 没有标记和清除过程,实现简单,运行高效
  • 复制过去以后保证空间的连续性,不会出现“碎片”问题
  • 缺点
    • 此算法的缺点也是很明显,就是需要两倍的内存空间
    • 对于G1这种分拆成为大量region的GC,复制而不是移动,意味着GC需要维护region之前对象引用关系,不管是内存占用或者时间开销也不小
    • 如果系统中的垃圾对象很多,复制算法需要复制的存活对象数量并不会太大,或者说非常低才行。
      在这里插入图片描述
标记-压缩(整理)Mark-Compact算法

标记清除算法的确可以应用在老年代中,但是该算法不仅执行效率低下,而且执行完内存回收后还会产生内存碎片,所以JVM设计者需要在此基础上进行改进,标记-压缩算法由此诞生

  • 执行过程
    • 第一阶段和标记清除算法一样,从根节点开始标记所有被引用对象
    • 第二阶段将所有的存活对象压缩到内存的一端,按顺序排放,之后清理边界外所有的空间
  • 标记压缩算法等同于标记清除算法执行完成后,再进行一次内存碎片整理,因此也称为标记-清除-压缩算法
  • 二者本质差异在于标记-清除算法是一种非移动式的回收算法,标记-压缩是移动式的,是否移动回收后的存活对象是一项优缺点并存的风险决策
  • 可以看到,标记存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉,如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,比维护一个空闲列表显然少了许多开销
  • 优点
    • 消除了标记-清除算法当中,内存区域分散的缺点,我们需要给新对象分配内存时,JVM只需要一个内存起始地址即可
    • 消除了复制算法当中,内存减半的高额代价
  • 缺点
  • 从效率上来说,标记-整理算法低于复制算法
  • 移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址
  • 移动过程中,需要全程暂停用户应用程序,即STW
算法对比

在这里插入图片描述
效率上来说,复制算法是当之无愧的老大,但是却浪费了太多内存,拿空间换时间
而为了尽量兼顾上面提到的三个指标,标记-整理算法相对来说更平滑一些,但是效率上不尽如人意,它比复制算法多了一个标记的阶段,比标记-清除多了一个整理内存阶段。

分代收集算法
  • 不同对象的生命周期是不一样的,因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。一般是把Java堆分为新生代和老年代,这样可以根据各个年代的特点使用不同的回收算法,以提高垃圾回收的效率
  • 在Java程序运行过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如http请求中的Session对象、线程、socket连接,这类对象跟业务直接挂钩,因此生命周期比较长,但还有一些对象,主要程序运行时生成的临时变量,这些对象生命周期比较短,比如String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至只用一次即可回收
  • 年轻代
    • 年轻代特点,区域相对老年代较小,对象生命周期短,存活率低,回收频繁
    • 这种情况复制算法的回收整理,速度是最快的,复制算法的效率只和当前存活对象大小有关,因此很适用于年轻代的回收,而复制算法内存利用率不高的问题,通过hotspot中的两个Survivor的设计得到缓解
  • 老年代
  • 老年代特点:区域较大,对象生命周期长、存活率高,回收不及年轻代频繁
  • 这种情况存在大量存活率高的对象,复制算法明显变得不合适,一般由标记-清除或标记-整理的混合实现
  • Mark阶段的开销与存活对象的数量成正比
  • Sweep阶段的开销与所管理区域的大小成正相关
  • Compact阶段的开销与存活对象的数据成正比
增量收集算法

如果一次性将所有的垃圾进行处理,需要造成系统长时间的停顿,那么就可以让垃圾收集线程和应用程序线程交替执行。每次,垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程。依次反复,直到垃圾收集完成。
总的来说,增量收集算法的基础仍是传统的标记-清除和复制算法,增量收集算法通过对线程间冲突的妥善处理,允许垃圾收集线程以分阶段的方式完成标记、清理或复制工作

  • 缺点
  • 由于垃圾回收过程中,间断性地还执行了应用程序代码,所以能够减少系统的停顿时间,但是,因为线程切换和上下文转换的消耗,会使用得垃圾回收的总体成本上升,造成系统吞吐量的下降
分区算法
  • 一般来说,在相同条件下,堆空间越大,一次GC时所需要的时间就越长,有关GC产生的停顿也越长,为了更好的控制GC产生的停顿时间,将一块大的内存分割成多个小块,根据目标的停顿时间,每次合理的回收若干个小区间,而不是整个堆空间,从而减少一次GC所产生的停顿
  • 分代算法将按照对象的生命周期长短划分成两个部分,分区算法将整个堆空间划分成连续的不同小区间
  • 每个小区间都独立使用,独立回收,这种算法的好处是可以控制一次回收多少个小区间

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis分布式存储方案

一、Redis分布式存储方案 1、哈希取余分区 ①、原理 哈希计算:首先,对每个键(key)进行哈希计算,得到一个整数哈希值(hash value)。取余操作:将这个哈希值对服务器数量进行取余操作…

Ansible03-Ansible Playbook剧本详解

目录 写在前面5. Ansible Playbook 剧本5.1 YAML语法5.1.1 语法规定5.1.2 示例5.1.3 YAML数据类型 5.2 Playbook组件5.3 Playbook 案例5.3.1 Playbook语句5.3.2 Playbook1 分发hosts文件5.3.3 Playbook2 分发软件包,安装软件包,启动服务5.3.3.1 任务拆解…

数分之SQL查询电商数据案例

1,Python连接SQL数据库 以下是使用Python连接MySQL数据库并进行操作的示例代码: import random import time import pymysql# 定义名字数据 xing ["王", "李", "张", "刘", "陈", "杨", "黄&q…

【火猫CS2】fantic取代C9参加YaLLa指南针

1、近日YaLLa Compass主办方宣布,由于Could9战队未能在截止日期前提交完整的参赛阵容,fantic战队将取代其参赛。该比赛将在阿联酋阿布扎比举行,总奖金40万美元。 最近一段时间Cloud9战队最近将electroNic转会至VP,又下放了HObbit和Perfecto,队伍因没有完整阵容已被迫退出EPL S1…

服装服饰商城小程序的作用是什么

要说服装商家,那数量是非常多,厂家/经销门店/小摊/无货源等,线上线下同行竞争激烈,虽然用户群体广涵盖每个人,但每个商家肯定都希望更多客户被自己转化,渠道运营方案营销环境等不可少。 以年轻人为主的消费…

前端破圈用Docker开发项目

为什么要用 Docker 开发 🤔 直接在系统上开发不香吗?香,但是 Docker 有下面4香 环境依赖管理:Docker 容器可以管理所有依赖项,例如前端里面的 node 和 npm 版本,不需要在本地安装和维护这些依赖项 隔离&a…

【刷题(12)】图论

一、图论问题基础 在 LeetCode 中,「岛屿问题」是一个系列系列问题,比如: 岛屿数量 (Easy)岛屿的周长 (Easy)岛屿的最大面积 (Medium)最大人工岛 (Hard&…

高效记录收支明细,预设类别账户,智能统计财务脉络,轻松掌握个人财务!

收支明细管理是每位个人或企业都必须面对的财务任务,财务管理已经成为我们生活中不可或缺的一部分。如何高效记录收支明细,预设类别账户,智能统计财务脉络,轻松掌握个人财务?晨曦记账本为您提供了完美的解决方案&#…

windows环境redis未授权利用手法总结

Redis未授权产生原因 1.redis绑定在0.0.0.0:6379默认端口,直接暴露在公网,无防火墙进行来源信任防护。 2.没有设置密码认证,可以免密远程登录redis服务 漏洞危害 1.信息泄露,攻击者可以恶意执行flushall清空数据 2.可以通过ev…

使用docker安装nacos单机部署

话不多说,直接进入主题 1.查看nacos镜像 docker search nacos 一般选第一个也就是starts最高的。 2.拉取nacos镜像 docker pull nacos/nacos-serverdocker pull nacos/nacos-server:1.4.1 由于我使用的项目alibabacloud版本对应的是nacos1.4.1版本的,所以我安装的是1.4.1…

复购率下降是什么原因导致的?三个步骤直击复购率下降根源

在商业运营中,回购率的波动往往能够直观地反映出客户对品牌和产品的忠诚程度。一个健康的回购率可以为企业带来稳定的收入流,同时也是品牌口碑和市场影响力的有力证明。但是,当企业面临回购率下降的情况时,这通常是一个警示信号&a…

新版IDEA没有办法选择Java8版本解决方法

2023年11月27日后,spring.io 默认不再支持创建jdk1.8的项目 解决方法就是把 Spring的Server URL 改为阿里的。 阿里的Server URL https://start.aliyun.com/ 默认的Server URL https://start.spring.io 阿里的Server URL https://start.aliyun.com/

【iOS】UI学习(一)

UI学习(一) UILabelUIButtonUIButton事件 UIViewUIView对象的隐藏UIView的层级关系 UIWindowUIViewController定时器与视图对象 UISwitch UILabel UILabel是一种可以显示在屏幕上,显示文字的一种UI。 下面使用代码来演示UILabel的功能&#…

AI联想扩图解决方案,智能联想,无需人工干预

对于众多企业而言,无论是广告宣传、产品展示还是客户体验,高质量、宽广视野的图像都是不可或缺的。受限于车载摄像头等设备的物理限制,我们往往难以捕捉到完整、宽广的视觉场景。针对这一挑战,美摄科技凭借其前沿的AI联想扩图解决…

H2RSVLM:引领遥感视觉语言模型的革命

随着人工智能技术的飞速发展,遥感图像理解在环境监测、气候变化、粮食安全和灾害预警等多个领域扮演着越来越重要的角色。然而,现有的通用视觉语言模型(VLMs)在处理遥感图像时仍面临挑战,主要因为遥感图像的独特性和当…

15.Redis之持久化

0.知识引入 mysql的事务,有四个比较核心的特性. 1. 原子性 2.一致性 3.持久性 >(和持久化说的是一回事)【把数据存储在硬盘 >持久把数据存储茌内存上>不持久~】【重启进程/重启主机 之后,数据是否存在!!】 4.隔离性~ Redis 是一个 内存 数据库.把数据存储在内存中的…

【数据结构和算法】-动态规划爬楼梯

动态规划(Dynamic Programming,DP)是运筹学的一个分支,主要用于解决包含重叠子问题和最优子结构性质的问题。它的核心思想是将一个复杂的问题分解为若干个子问题,并保存子问题的解,以便在需要时直接利用&am…

万亿应急国债项目之通信指挥类应急装备多链路聚合通信设备在应急行业中的重要作用

万亿应急国债项目的推出,无疑是我国在应急领域的一次重大举措。在这一宏大蓝图中,通信指挥类应急装备的多链路聚合通信设备显得尤为重要,其在应急行业中所发挥的作用,堪称不可或缺的关键一环。 通信指挥是应急响应中的核心环节&a…

登峰造极,北斗相伴——纪念人类首次登顶珠穆朗玛峰71周年

71年前的今天,1953年5月29日11时30分,人类实现了一个伟大的壮举:首次登上了珠穆朗玛峰,这座海拔8848.86米的世界最高峰。这是一次充满了艰辛、勇气和智慧的探险,也是一次改变了人类历史和文化的探险。 自那以后&#…

[FlareOn6]Overlong

很简单的逻辑 一度让我以为是加保护了 运行告诉我从未编码,懵逼 动调你也发现,你根本没什么可以操作的空间,密文什么的,都是固定的 但是这里大家发现没 我们只加密了28个密文 然后text是128 也就是 0x80 是不是因为密文没加密完呢 我也懒得去写代码了 汇编直接修改push 字…