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_…

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

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

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

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

JAVA面试八股文之数据库

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

面试算法-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…

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

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

前端代码优化--computed

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

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 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…

python-study-day1-(病人管理系统-带sql)

MainWindow代码 from tkinter import * from tkinter import messagebox from tkinter.ttk import Comboboxclass MianWindow(Frame):def __init__(self, masterNone):super().__init__(master, padx30, pady20)self.flag 0self.pack(expandTrue, fillBOTH)self.id StringVa…

深入OceanBase内部机制:系统架构与组件精讲

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 1️⃣OceanBase 整体架构1.1 分区1.2 分片1.3 日志流1.4 对等节点1.5 多租户 2️⃣OceanBase 架构与组件详解2.1 存储层2.2 …

Disk Drill Enterprise for Mac v5.5.1515数据恢复软件中文版

Disk Drill 是 Mac 操作系统固有的Mac数据恢复软件:使用 Recovery Vault 轻松保护文件免遭意外删除,并从 Mac 磁盘恢复丢失的数据。支持大多数存储设备,文件类型和文件系统。 软件下载:Disk Drill Enterprise for Mac v5.5.1515激…

keepalived2.2.8+drbd9+nfs高可用存储部署

目录 一.本文基于上一篇文章keepalived环境来做的,主机信息如下 二.为两台虚拟机准备添加一块新硬盘设备 三.安装drbd9 1.使用扩展源的rpm包来下载 2.创建资源并挂载到新增的硬盘 3.主设备升级身份 4.主备两个设备手动切换身份演示 四.安装配置nfs 五.安装…

【YOLOv8】Yolov5和Yolov8网络结构的分析与对比

目录 一 YOLOv5 二 YOLOv8 yolo通常采用backbone-neck-head的网络结构。 Backbone 主要负责从输入图像中提取高层次的语义特征,常包含多个卷积层和池化层,构建了一个深层次的特征提取器。Neck通常用来进一步整合与调整backbone提取的特征,有利于将不同…

大话设计模式——24.迭代器模式(Iterator Pattern)

简介 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部实现。(Java中使用最多的设计模式之一) UML图 应用场景 Java的集合对象:Collection、List、Map、Set等都有迭代器Java ArrayList的迭代器源码 示例 简…

uniapp的h5项目 用命令起这个项目(vue-cli)

这里其实就相当于给uniapp h5套了一个vue-cli的壳(纯属个人感觉) 首先需要安装vue-cli 脚手架 npm install -g vue/cli然后创建项目(这里需要在hbuilder创建) vue create -p dcloudio/uni-preset-vue uniapp安装成功后它的结构…

OSCP靶场--Dibble

OSCP靶场–Dibble 考点(前端鉴权参数修改node.js代码注入 suid cp提权 ) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.173.110 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-09 06:36 EDT Nmap scan repor…