JVM修炼之路【10】- 垃圾回收器和垃圾回收算法

垃圾回收算法

我们先简要看一下 四种主要的垃圾回收算法

在这里插入图片描述
看到这不禁感慨一下 人家1960年 都搞出GC算法了 太强了


评价标准

既然有这么多算法 那就跟各个牌子的游戏本一样 有个比较,这里我们重点介绍一下 垃圾回收算法的评价标准
这几个标准非常重要是 是后面理解很多东西的基石,大家一定要好好理解

首先大家要理解 垃圾回收也是一个线程 在运行,它的本质和其他我们工作的线程没什么区别,既然是线程就会有占用 就会有阻塞。
一旦触发垃圾回收线程开始垃圾回收的时候, 部分阶段 比如fullgc 会停止所有的用户线程。

也就是说 你的java服务器里的用户线程 全体罚站。

这个过程叫STW ,

所以如果你的系统是频繁用户交互的 那你就要注意 不能使用STW过长的垃圾回收策略
在这里插入图片描述
于是有了下面三个评价标准:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这三个标准 就和 分布式理论里面那个CAP一样 不可兼得。

比如吞吐量 是 用户代码时间 / cg时间+其他所有时间。 这个比例可能很出色,但是分子和分母都越来越大 那cg时间就越来越长

cg时间越来越长 STW最大时间就越来越大


四种垃圾回收算法

标记清除算法

最好理解 最简单 最无脑的算法

我们之前说了GC root 根节点 可达性分析法 ,去寻找那些有根的对象 和断根的对象, 找到那些断线的 需要回收的对象 就清除掉。

就这么简单。

它的优点是 简单 迅速。

但是缺点很多 就是会产生大量的 内存碎片, 这些内存碎片 就是清除之后 留下来的空间 大小不一

在这里插入图片描述

复制算法

复制算法 把内存区域 分成2块:from 、 to。 只有一块可以存储对象、

看到这还不知道它怎么清理, 它的一个缺点就已经暴露了—— 你的内存使用打半折 只有一般能用

首先往from区里面 存对象 ,这时候to 是空的

那么它需要gc的时候 还是用可达性算法 把非断根的那些不需要回收的对象找出来 把这些良好市民 都移动到 to

然后把from 清空。

它的好处就是没有内存碎片 因为移动到to 就整齐排列了
在这里插入图片描述

标记整理

标记整理 就是 标记清除的进化版。

首先它还是一块内存区域 不会像复制算法一样 一分为二。

然后 我们刚才讲了 标记整理是 找到那些需要清除的 然后清除掉就完事了

而标记整理 他们清除之后 把剩下的对象空间重新排列 , 这样那些内存碎片也就都被挤出来了。

但是

就是因为比标记清除多了整理者一步 意味着它的性能不佳。

(单是整理这一步 可能要内存上 大部分的对象地址空间都要移动 , 还记得那个经典问题 arraylist 和linkedlist之间的性能选择吗。 类似于你在动态数组中做增删操作 )

分代回收算法

这个就是前几种算法组合 也是现代最流行的算法

首先他把堆分为 新生代 和老年代

新生代顾名思义 就是刚创建出来的对象。

老年代就是存活时间较长的对象

新生代 中又分为 Eden区(伊甸园区 上帝刚创造人类的地方) S0区 S1区

在这里插入图片描述

我们来讲下这个过程。 首先刚开始 所有区域 都是空的 :

创建第一个对象:
当程序创建第一个对象时,这个对象会被分配到年轻代中。假设这个对象是一个新的实例,它被分配到年轻代的 Eden 区域。

对象存活和垃圾回收:
随着时间的推移,堆内存中会不断创建新的对象。这些对象可能被引用,也可能成为垃圾,即不再被引用。当年轻代的 Eden 区域填满时,会触发一次 Minor GC(年轻代垃圾回收)。在 Minor GC 中,存活的对象会被移动到存活区域(Survivor Space),而不再被引用的对象将被标记为可回收的垃圾。被标记为垃圾的对象将被回收释放。

晋升到老年代:
如果对象在年轻代经过几轮的 Minor GC 后仍然存活,它将被晋升到老年代。通常,对象在老年代存活时间更长,因此老年代的垃圾回收频率相对较低。

Full GC:
当老年代内存空间不足时,会触发 Full GC。Full GC 会对整个堆内存进行垃圾回收,包括年轻代和老年代。在 Full GC 中,所有的存活对象都会被标记并移动,而不再被引用的对象将被回收释放。Full GC 的成本通常比 Minor GC 更高,因为它需要对整个堆内存进行扫描和处理。

Out of Memory:
如果堆内存无法满足程序的内存需求,将会发生 Out of Memory 错误。这通常发生在无法为新对象分配内存空间时,或者在进行垃圾回收后仍然无法腾出足够的内存空间时。此时,程序无法继续执行,并抛出 Out of Memory 错误。


垃圾回收器

首先新手要理解一点 垃圾回收器都是组合使用的 出来G1外,这些乱七八糟的组合大家不用死记硬背。
在这里插入图片描述

这里介绍经典的2种组合,以及最新的垃圾回收器 G1:

如果你关注暂停时间 不想太长 就用 PN+CMS

CMS这个回收器 它的特点是并发执行,允许用户现场和gc线程同时跑, 但是它用的是标记清除算法 容易产生内存碎片

在这里插入图片描述

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

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

相关文章

springCloudAlibaba集成sentinel实战(超详细)

一、Sentinel介绍 1. 什么是Sentinel Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 分布式系统的流量防卫兵: 随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel以“流…

你知道 Java 线程池的原理吗?

Java线程池是用于管理和复用线程的机制,它可以帮助开发者有效地管理线程的生命周期和资源,并提高应用程序的性能和稳定性。 1. 线程池概述 在计算机科学中,线程池是一种可用来执行异步任务的线程队列。它主要包含以下几个组成部分&#xff…

python连接mysql数据库并将dataframe的数据插入表中

代码中连接的sql表为"20230411_hangzhuanlie",表结构如下: 代码如下(按需修改用户名、库名等即可): import pymysql import pandas as pd from sqlalchemy import create_enginehost 127.0.0.1:3306/ user_…

科研学习|论文解读——基于旅游知识图谱的游客偏好挖掘和决策支持(IPM,2023)

原文题目 Mining tourist preferences and decision support via tourism-oriented knowledge graph 摘要 目前,旅游管理研究的重点是通过对异构用户生成的内容进行广泛分析,来理解旅游偏好的波动,制定有针对性的发展策略。然而,鉴于在线景点评论涉及过多的混合和无形维度…

【51单片机入门记录】IIC总线协议 EEPROM存储器AT24C02应用

目录 一、AT24C20相关函数操作流程 (0)根据第十五届蓝桥杯初始iic.c进行的初步修改(便于编写后续函数) (1)AT24C20存数据操作流程及代码 (2)AT24C02读数据操作流程及代码 &#…

一、OpenMIPS指令集CPU的ori指令的实现

前言 根据“自己动手写CPU”这本书学习,自己动手实现一个MIPS指令集的CPU。 本文章实现了一个ori指令即“或”操作的五级流水线,后续会持续添加其他指令完善此CPU。 文章作为学习笔记持续更新,源代码也在github上持续更新 项目源码https://…

MySQL 行锁和表锁是什么?区别,作用等学习总结

一、所谓‘锁’ 是什么 个人理解,所谓的锁就是为了保证数据库数据操作的一致性而产生的一种机制,即我们可能有很多数据,但是当我们有多个人或者多个线程或会话对同一条数据或同一批数据执行操作时,可能大家都要修改这一部分数据&…

头歌-机器学习 第1次实验 Python机器学习软件包Scikit-Learn的学习与运用

第1关:使用scikit-learn导入数据集 scikit-learn包括一些标准数据集,不需要从外部下载,可直接导入使用,比如与分类问题相关的Iris数据集和digits手写图像数据集,与回归问题相关的波士顿房价数据集。 以下列举一些简单…

JAVA面试八股文之数据库

MySQL面试题 MySQL 存储引擎架构了解吗?CHAR 和 VARCHAR 的区别是什么?索引是越多越好嘛?MySQL数据库中空值(null)和空字符串()的区别?SQL 中 on 条件与 where 条件的区别&#xff1…

mySql数据库学习003-多表查询

多表查询 创建数据表:班级表与学生表 create table if not exists class(id tinyint unsigned primary key auto_increment,name varchar(20) not null,description varchar(255),createAt timestamp default current_timestamp,updateAt timestamp default curre…

面试算法-171-翻转二叉树

题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {if (root n…

Leetcode【双指针法】

目录 一、left right在一个循环里 二、两个指针在各自的循环里 三、slow fast追逐型 四、slow fast条件型 双指针法常用与题型:数组、字符串、链表、N数之和 一、left right在一个循环里 left right在一个循环里。 left和right移动需要条件,一般是向…

腾讯云4核8G服务器多少钱?4核8G能干啥?

腾讯云4核8G服务器多少钱?腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月,活动页面 txybk.com/go/txy 活动链接打开如下图所示: 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器,详细配置为:轻量4核…

【2024年5月备考新增】冲刺(1)《第四版教材十五矩阵》

所谓十五矩阵,就是十大管理,五大过程组 【高项】信息系统项目管理师教程(第4版)十五矩阵知识领域项目管理过程组启动过程组规划过程组执行过程组监控过程组收尾过程组项目整合管理制定项目章程制订项目管理计划指导与管理项目工作监控项目工作结束项目或阶段管理项目知识实…

前端代码优化--computed

随便记录一下 主要是通过计算属性来简化和优化代码。在 Vue 中,计算属性是一种方便的工具,可以让你根据依赖状态的变化来动态计算衍生值。在这个例子中,我们使用计算属性 formattedCommunicationType 来根据 workDetail.realTimeItemDeviceDT…

node.js常用命令大全

命令用法nodenode [文件名]:运行指定的 Node.js 脚本文件; node --version:显示当前安装的 Node.js 版本号; node -h 或 node --help:显示 Node.js 的帮助信息。npmnpm install [模块名]:安装指定的 Node.j…

Scala之函数Day-2

Scala 函数(Function) 概述 将一段逻辑进行封装便于进行重复使用,被封装的这段逻辑就是函数。在Scala中,必须通过def来定义函数 基本语法 def 函数名(参数列表) : 返回值类型 {函数体return 返回值 }案例 // 案例:定义函数计算两个整数的…

openlayer实现webgis端绘制制图及编辑

在WebGIS端制图是指通过Web浏览器界面实现地理信息数据的可视化、编辑、分析以及地图产品的制作。这一过程通常涉及以下几个关键环节: **1. 前端技术栈: •HTML/CSS/JavaScript:作为Web开发的基础,用于构建用户界面布局、样式设…

Win11又来「重大」更新!

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站ai人工智能工具 更多资源欢迎关注 Windows 11预览通道的22635.3420版本迎来了几个比较大的改进,主要有三个方面: …

一种快速移植 OpenHarmony Linux 内核的方法

移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者,介绍一种借助三方芯片平台自带 Linux 内核的现有能力,快速移植 OpenHarmony 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…