【Java】垃圾回收学习笔记(二):分代假说与垃圾回收算法

news2024/10/6 2:35:01

文章目录

  • 0. 分代收集理论
    • 分代假说
    • 分代GC定义
  • 1. 垃圾回收算法
    • 1.1 标记清除(Mark-Sweep)算法
      • 优点
      • 缺点
    • 1.2 标记复制算法
      • 优点
      • 缺点
      • 为什么是8:1:1?
    • 1.3 标记整理算法
      • 优点
      • 缺点
  • 2. 是否移动?

0. 分代收集理论

分代假说

现在多数JVM GC都遵循分代收集(Generational Collection)理论,其中涉及三个经验性的分代假说:

  1. 弱分代假说(Weak Generational Hypothesis):绝大多说对象都是朝生夕灭
    1. 对象创建先进入新生代(Young/Nursery),进行较为频繁、局限于新生代的Minor GC
  2. 强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象,越难以消亡
    1. 对象经过几轮gc后进入老年代(Old/Tenured),进行次数相对少、局限于老年代的Major GC
  3. 跨代引用假说(Intergenerational Reference Hypothesis):跨代引用相对于同代引用来说占比极少
    1. 跨代引用:比如新生代对象可能被老年代所引用,所以Minor GC时需要在固定的GC Roots外,再额外增加老年代中的Roots来保证可达性分析的正确性(young引用old同理)。
    2. 以新生代被老年代引用为例,根据跨代引用假说,如果遍历整个老年代的引用关系来增加GC Roots,效率将会非常低,可以通过在新生代增加专门的数据结构(记忆集,Rememered),来标识跨代引用关系。比如,CMS和G1垃圾收集器都会通过写前屏障的方式,将跨代引用记录在卡表(可以看做一种记忆集)中。

分代GC定义

前面有提到Minor GC、Major GC之类的说法,其实就是不同分代中的GC行为,类似的定义包括:

  • **部分收集(Partial GC):**不完整收集整个Java堆的GC。又分为:
    • 新生代收集(Minor GC/Young GC):目标是新生代的GC
    • 老年代收集(Major GC/Old GC):目标是老年代的GC。目前只有CMS收集器会有只针对老年代的GC。
    • 混合收集(Mixed GC):目标是整个新生代部分老年代的GC。目前只有G1收集器会有Mixed GC。
  • **整堆收集(Full GC):**整个Java堆和方法区的GC。

1. 垃圾回收算法

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

将垃圾回收分为标记和清除两个阶段:

  1. 标记阶段:标记出所有活跃对象(或者标记死亡对象)
  2. 清除阶段:回收未被标记为活跃的对象(或者标记死亡的对象)

在这里插入图片描述

优点

实现简单、速度快。后面的收集算法大多在此基础上改进得来的。

缺点

  • 执行效率不稳定:标记、清除的执行效率随对象数增加而降低;
  • 清除后可能造成内存碎片:如果new了一个大的对象,碎片化的内存没法使用,造成内存浪费。

1.2 标记复制算法

将内存分为两个区域:一个区域用于存储存活对象,一个保留区域

  1. 标记处所有存活对象,移动到保留区域
  2. 移动到保留区域的对象进行内存整理(避免碎片化)
  3. 将原有区域整个清理掉,变成新的保留区域

在这里插入图片描述

现代的商用Java虚拟机大多采用改进的标记复制算法来进行新生代GC。

优点

效率很高,不会产生内存碎片

缺点

  • 对象存活率较高时,需要很多复制操作,效率降低。比如老年代中,大部分对象存活周期都很长(前面提到过的强分代假说),所以老年代中一般不采用标记-复制算法。
  • 保留区域与存活区域1:1(半区复制,Semispace Copying)的话,会有一半内存被浪费。

一些现代的垃圾收集器(ParNew等)中将新生代分为Eden区+2个Survive(Survivor)区(8:1:1,Appel式回收)解决内存浪费:new对象先分配到Eden中,将Eden与非保留区域的survivor1标记后,将存活对象移动到作为保留区域的Survivor2中,将其他区域(Eden与Survivor1)GC,survivor1成为新的保留区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么是8:1:1?

大家都知道新生代对象的寿命大部分都很短,也就是弱分代假说中的“朝生夕灭”。IBM公司有研究对对象的“朝生夕灭”做了量化,即新生代对象中98%熬不过第一轮GC。因此完全没必要按照1:1分配新生代空间。

HotSpot虚拟机默认的Eden与Survivor比例是8:1,可以保证每次新生代可用内存空间为整个新生代的90%(Eden 80%+非保留区域survivor的10%)。

但可能存在多于10%对象存活的情况。因此,当一次Minor GC后,Survivor空间不足以容纳幸存的对象,就需要老年代作为保底。

1.3 标记整理算法

  • 标记阶段:标记存活对象,清除垃圾对象。
  • 整理阶段:内存整理,让存活对象向内存空间的一端移动。

在这里插入图片描述

优点

  • 相比于标记-复制算法,内存使用效率高,吞吐量高;
  • 同时也不会有标记-清除算法的内存碎片化问题。

缺点

  • 消耗时间比较长,高并发场景可能影响系统性能

大家应该多少都听说过“Stop The World ”,也就是移动存活对象时(特别是老年代每次回收都有大量对象存活,需要大量移动操作),移动操作必须暂停用户应用程序。因此有时候老年代空间不足或内存碎片化过于严重(大对象内存申请不了),导致Full GC,就会面临STW的困境。如果想要减少STW的次数,可以适当增加新生代的比例,即大部分对象生命周期在新生代快速流转,可以适当减少老年代的STW。

标记-清除算法也要停顿用户线程,但是时间相对较短

2. 是否移动?

标记-清除算法跟其他两个算法最本质的区别,在于它没有移动操作,也因此存在内存碎片化的问题。当然,即使不移动,内存碎片化也不是没有解决办法,只能依赖更复杂的内存分配器和内存访问器来解决。但是内存访问是用户程序最频繁的操作之一,如果增加额外负担,会影响吞吐量。

可见:

  • 移动对象:内存回收会更加复杂,GC停顿时间较长,但吞吐量会更划算;
  • 不移动对象:内存分配时会更加复杂,GC停顿时间更短,但内存分配的额外操作会极大影响吞吐量。

因此,HotSpot虚拟机中,关注吞吐量的Parallel Scavenge收集器给予标记-整理算法,关注延迟的CMS(老年代)基于标记-清除算法(实际上CMS都会用,大多数时间标记-删除,等碎片化道影响大对象分配时,标记-整理一次)。

最新的ZGC和Shenandoah收集器使用读屏障是爱你整理过程和用户线程的并发执行

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

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

相关文章

Python编程学习笔记(2)--- 列表简介

1、列表是什么 列表由一系列按特定顺序排列的元素组成。可以创建包含字母表中所有字母、数字、0~9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。列表通常包含多个元素,因此给列表指定一个表示复数…

python库(6):Pygments库

1 Pygments介绍 在软件开发和文档编写中,代码的可读性是至关重要的一环。无论是在博客文章、技术文档还是教程中,通过代码高亮可以使程序代码更加清晰和易于理解。而在Python世界中,Pygments库就是这样一个强大的工具,它能够将各…

1.2 如何让机器说人话?万字长文回顾自然语言处理(NLP)的前世今生 —— 《带你自学大语言模型》系列

本系列目录 《带你自学大语言模型》系列部分目录及计划,完整版目录见:带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型(科普向) 第一章 走进大语言模型 1.1 从图灵机到GPT,人工智能经历了什么&#xff1…

Powershell 获取电脑保存的所有wifi密码

一. 知识点 netsh wlan show profiles 用于显示计算机上已保存的无线网络配置文件 Measure-Object 用于统计数量 [PSCustomObject]{ } 用于创建Powershell对象 [math]::Round 四舍五入 Write-Progress 显示进度条 二. 代码 只能获取中文Windows操作系统的wifi密码如果想获取…

【绿色版】Mysql下载、安装、配置与使用(保姆级教程)

大家都知道,Mysql安装版的卸载过程非常繁琐,而且卸载不干净会出现许多问题,很容易让大家陷入重装系统的窘境。基于此,博主今天给大家分享绿色版Mysql的安装、配置与使用。 目录 一、Mysql安装、配置与使用 1、下载解压 2、创建…

02STM32软件安装新建工程

STM32软件安装&新建工程 1.软件安装:1.1Keil5 MDK安装1.2安装器件支持包离线安装支持包在线安装支持包 1.3软件注册:1.4安装驱动STLINK驱动JLink驱动在此文件夹下USB转串口 2开发方式&新建工程步骤&架构个人心得 1.软件安装: 安…

stm32精密控制步进电机(基础篇)

众所周知,步进电机由于使用脉冲控制,会比直流电机的控制稍难一些,但开环控制时也更加稳定。 落到做项目的时候,目前来说我都会先考虑步进电机,再去考虑直流,无刷这样的电机。包括毕设时所用的机械臂也是用…

Linux开发讲课33---线程实现与线程控制步骤简析

线程概述 进程是系统中程序执行和资源分配的基本单位。 每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时都需要有比较负责的上下文切换等动作。为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程在演…

Java基础-内部类与异常处理

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、Java 内部类 什么是内部类? 使用内部类的优点 访问局部变量的限制 内部类和继承 内部…

一位3D打印工程师繁忙的一天

早晨:准备与规划 7:00 AM - 起床与晨练 3D打印工程师早起进行晨练,如跑步或瑜伽,以保持身心健康。晨练后,享用一顿健康的早餐,为一天的繁忙工作做好准备。 8:00 AM - 检查邮件和项目进展 在开始工作前,先…

封装了一个仿照抖音效果的iOS评论弹窗

需求背景 开发一个类似抖音评论弹窗交互效果的弹窗,支持滑动消失, 滑动查看评论 效果如下图 思路 创建一个视图,该视图上面放置一个tableView, 该视图上添加一个滑动手势,同时设置代理,实现代理方法 (BOOL)gestur…

Zkeys三方登录模块支持QQ、支付宝登录

1,覆盖到根目录,并导入update.sql数据库文件到Zkeys数据库里 2. 后台系统权限管理,配置管理员权限-系统类别-找到云外科技,全部打勾 3,后台系统设置找到云外快捷登录模块填写相应的插件授权配置和登录权限配置&#x…

【python中级】图像从从笛卡尔坐标系转换为极坐标系

【python中级】图像从从笛卡尔坐标系转换为极坐标系 1.背景2.生成二维图3.极坐标转换1.背景 笛卡尔坐标系就是我们常说的直角坐标系。 笛卡尔坐标系,也称为直角坐标系,是由法国数学家和哲学家勒内笛卡尔(Ren Descartes)发明的一种二维或三维坐标系统。它使用两个或三个相互…

人工智能在病理切片虚拟染色及染色标准化领域的系统进展分析|文献速递·24-07-07

小罗碎碎念 本期文献主题:人工智能在病理切片虚拟染色及染色标准化领域的系统进展分析 这一期文献的速递,是有史以来数量最大的一次,足足有十一篇,本来打算分两期写,但是为了知识的系统性,我决定咬咬牙&…

texStudio使用(小白)

原先使用overleaf在线编译,可能eps格式的图片太大导致需要充钱,所以考虑本地安装 安装教程参考B站视频:B站Latex本地编译器安装:TexLive TextStudio 踩到坑: 1. 编译器位置要选择对 因为BibTex选成了Biber导致出现无…

minist数据集分类模型的训练

minist数据集训练 训练方法:利用pytorch来实现minist数据集的分类模型训练 训练模型如下图所示 模型代码: import torch from torch import nn from torch.nn import Flattenclass Net(nn.Module):def __init__(self):super().__init__()self.module …

文件管理下:文件函数的学习

前言 Hello,小伙伴们你们的作者君又来了,上次我们简单介绍了文件的坐拥并简单提到了数据的读取,和C语言的默认流的作用,今天我将继续带领大家探索文件的奥秘,大家准别好了吗? 在内容开始之前还是按照惯例&#xff0c…

**kwargs 字典解包传参的方式

字典解包传参 在Python中,****kwargs**是一种通过字典解包 (dictionary unpacking) 的方式进行参数传递的方式。它将一个字典的键值对解包并传递给函数的命名参数。 示例代码 kwargs实参: {name: "jordan", age: 18, score: [80, 85, 85]} get_info形…

下载linux的吐槽

本来这几天放假了,想下一个linux玩一玩 教程(我就是根据这个教程进行下载的,但是呢在进行修改BIOS 模式的 地方遇见了困难,也许是电脑修过的原因,我狂按F12 以及 FnF12都没有BIOS设置,只有一个让我选择用w…

前端扫盲:cookie、localStorage和sessionStorage

cookie、localStorage和sessionStorage都是存储数据的方式,他们之间有什么不同,各有什么应用场景,本文为您一一解答。 一、什么是cookie、localStorage和sessionStorage 1. Cookie是一种存储在用户计算机上的小型文本文件,由服务…