【JVM】垃圾回收算法
📝个人主页:五敷有你
🔥系列专栏:JVM
⛺️稳中求进,晒太阳
垃圾回收算法
Java是如何实现垃圾回收的呢?简单来说,垃圾回收就做两件事
- 找到内存中存活的对象
- 释放不在存活对象的内存,使得程序能再次利用这部分空间
垃圾回收算法的历史和分类
1960年发布了第一个GC算法:标记-清除算法。
1963年发布了复制算法
本质上后续所有垃圾回收算法都是在两种算法的基础之上优化而来
Java垃圾回收过程会通过单独的GC线程来完成,但不管使用哪种GC算法都会有部分阶段需求停止所有的用户线程,这个过程被称为StopTheWorld 简称STW,如果STW时间过程会影响用户使用
垃圾回收算法的评价标准
1.吞吐量:
CPU用于执行用户代码的时间与CPU总执行时间的比值,吞吐量数值越高,垃圾回收的效率就越高
即:吞吐量=执行用户代码时间/(执行用户代码时间+GC时间)
2.最大暂停时间
最大暂停时间指的是所有在垃圾回收过程中的STW时间最大值。最大暂停时间越短,用户使用系统时受到的影响越短
3.堆使用的效率
不同的垃圾回收算法,对堆的使用方式是不同的。
上面的三种标准不可兼得。
一般来说,堆内存越大,最大暂停时间就越长,想要减少最大暂停时间,就会降低吞吐量。
标记清除算法
标记清除算法的核心分为两个阶段:
1.标记阶段,将所有存活的对象进行标记,Java中使用可达性分析法,从GC ROOT开始通过引用链遍历出所有存活对象。
2.清除阶段,从内存中删除没有被标记也就是非存活的对象,
优点:实现简单,只需要在第一阶段给每个对象维护标志位。第二阶段删除对象即可。
缺点:
1.碎片化问题。
由于内存是连续的,所以在对象被删除后,内存中会出现很多细小的可用内存单元。如果我们需要一个比较大的空间,很可能这些内存单元的大小过小而无法分配。
2.分配速度慢,由于内存碎片的存在,需要维护一个空闲链表,极有可能发生每次需要遍历到链表最后才能获取合适的内存空间
复制算法
复制算法的核心思想是:
- 准备两块空间From空间和To空间,每次对象分配阶段,只能使用其中一块空间(From 空间)
- 在垃圾回收GC阶段,将From中存活对象赋值到To空间。
- 将两块空间的From和To名字互换。
优点:
吞吐量高:复制算法只需要遍历一次存活对象复制到To空间即可,比标记-整理算法少了一次遍历的过程,因而性能较好,但是不如标记-清除算法因为标记清除算法不需要进行对象的移动。
不发生碎片化:复制算法在复制之后就会将对象按顺序放入To空间,所以对象以外 的区域都是可用空间,不存在碎片化内存空间
缺点:
内存使用效率低:每次只能让一半的内存空间来为创建对象使用
标记整理算法
标记整理算法也叫标记压缩算法,是对标记整理算法中容易产生内存碎片问题的一种解决方案。
核心思想分为两个阶段
标记阶段:将所有存活的对象进行标记,Java中使用可达性分析算法,从GC Root开始通过引用链遍历出所有存活对象。
整理阶段:将存活对象移动到堆的一端,清理掉存活对象的内存空间。
分代GC算法
现在优秀的垃圾回收算法,会将上述描述的垃圾回收算法组合进行使用,其中应用最广的就是分代垃圾回收
算法(Generational GC)
分代垃圾回收将整个内存区域划分为年轻代和老年代:
分代回收时,创建出来的对象,首先会被放入Eden伊甸园区
随着对象在Eden区越来越多,如果Eden区满,新创建的对象已经无法放入,就会触发年轻代的GC,称为Minbor GC或者 Young GC。
Minor GC会把需要eden中和From需要回收的对象回收,把没有回收的对象放入To区
接下来S0变成to区,s1变成From区,当eden区满时,在往里面放入对象。依然会发生Minor GC
此时会回收eden区和S1(from)中的对象,并把eden和from区中剩余的对象放入S0
注意:每次Minor GC中都会为对象记录他的年龄,初始值为0,每次GC完成加1
如果Minor GC后对象的年龄达到阈值(最大15,默认值和垃圾回收器有关),对象就会被晋升老年代
当老年代中空间不足,无法放入新的对象时,先尝试minor gc如果还是不足,就会触发Full GC对整个堆进行垃圾回收。
Full GC无法回收老年代的对象,那么当对象继续放入老年代,就会抛出Out Of Memory
相关文章:

【JVM】垃圾回收算法
📝个人主页:五敷有你 🔥系列专栏:JVM ⛺️稳中求进,晒太阳 垃圾回收算法 Java是如何实现垃圾回收的呢?简单来说,垃圾回收就做两件事 找到内存中存活的对象释放不在存活对象的内存&…...

如何和将原始request的Header中的值传递给openfeign请求的Header? 以及又如何获取openfeign请求中Header中的值
如何和将原始request的Header中的值传递给openfeign请求的Header? 以及又如何获取openfeign请求中Header中的值 如何和将原始request的Header中的值传递给openfeign请求的Header参考 [https://www.jb51.net/article/282522.htm](https://www.jb51.net/article/28252…...

Flink 侧输出流(SideOutput)
🌸在平时大部分的 DataStream API 的算子的输出是单一输出,也就是某一种或者说某一类数据流,流向相同的地方。 🌸在处理不同的流中,除了 split 算子,可以将一条流分成多条流,这些流的数据类型也…...

C语言中关于#include的一些小知识
写代码的过程中,因为手误,重复包含了头文件 可以看到没有报错 如果是你自己编写的头文件,那么如果没加唯一包含标识的话,那么编译器会编译报错的。如果是系统自带的头文件,由于其每个头文件都加了特殊标识,…...

DSP芯片 机器码下载方法 【主要 “扯” 用Uniflash下载的方法】
还是以德州仪器的TMS320F28335芯片为 “栗子”,说说这事儿。 编制好的程序经过开发环境可以编译成扩展名为 .out 文件,这个文件就是DSP可以运行机器码,我们把这个文件下载到 DSP芯片中的程序区, 下载好了,这个芯片原…...

速盾网络:CDN用几天关了可以吗?安全吗?
在使用CDN(内容分发网络)时,有时候会考虑暂时关闭或暂停使用CDN服务的情况。但是,对于关闭CDN服务的时间长短以及安全性问题,很多人可能存在疑问。在本文中,我们将讨论CDN使用中关闭几天是否安全以及相关注…...

MR混合现实情景实训教学系统在高空作业课堂中的应用
高空作业是一项高风险的工作,对于从业者来说,不仅需要具备专业的技能,还需要有丰富的实践经验。然而,传统的课堂教学往往只能通过理论讲解和模拟训练来传授知识,无法提供真实的实践环境。而MR混合现实情景实训教学系统…...

Windows系统中定时执行python脚本
背景:本地Windows系统指定目录下会有文件的修改新增,这些变化的文件需要定时的被上传到git仓库中,这样不需要每次变更手动上传了。 首先编写一个检测文件夹下文件变化并且上传git仓库的python脚本(确保你已经在E:\edc_workspace\data_edc_et…...

HashMap 源码学习-jdk1.8
1、一些常量的定义 这里针对MIN_TREEIFY_CAPACITY 这个值进行解释一下。 java8里面,HashMap 的数据结构是数组 (链表或者红黑树),每个数组节点下可能会存在链表和红黑树之间的转换,当同一个索引下面的节点超过8个时…...

WebStorm 2023:让您更接近理想的开发环境 mac/win版
JetBrains WebStorm 2023激活版下载是一款强大而智能的Web开发工具,专为提高开发人员的生产力而设计。这款编辑器提供了许多先进的代码编辑功能,以及一系列实用的工具和插件,可帮助您更快地编写、调试和测试代码。 WebStorm 2023软件获取 We…...

java面试题:数字与字母的映射表
前言 好记性不如烂笔头。 问题: 现在有一个数字与字母的映射表,且有以下规则: 映射表: 数字 字母 3 A 7 B 9 C 规则: 1.碰到当前数字时,使用字母替换,例如,3-> A 2.碰到当前数…...

Jmeter教程-JMeter 环境安装及配置
Jmeter教程 JMeter 环境安装及配置 在使用 JMeter 之前,需要配置相应的环境,包括安装 JDK 和获取 JMeter ZIP 包。 安装JDK 1.JDK下载 示例环境为Windows11环境,读者应根据实际环境下载JDK的安装包。 JDK下载地址: Java21 下载 …...

十大基础排序算法
排序算法分类 排序:将一组对象按照某种逻辑顺序重新排列的过程。 按照待排序数据的规模分为: 内部排序:数据量不大,全部存在内存中;外部排序:数据量很大,无法一次性全部存在内存中,…...

IP协议及相关技术协议
一、IP基本认识 1. IP的作用 IP在TCP/IP模型中处于网络层,网络层的主要作用是实现主机与主机之间的通信,而IP的作用是在复杂的网络环境中将数据包发送给最终目的主机。 2. IP与MAC的关系 简单而言,MAC的作用是实现“直连”的两个设备之通信…...

小红书x-s算法及补环境 单旋转验证码
前言 大家好呀!新的一年,先祝大家新年快乐咯.祝大家逆向,风控都一把过咯. 新年第一篇文章,后续会持续更新哦! 春晚见证了中国经济的新风口,今年春晚互联网企业赞助商就两家,小红书和京东.小红书类似国外的ins,有预感未来小红书会大火,所以写了这篇文章,有需要的加我,联系方式…...

代码检测规范和git提交规范
摘要:之前开发的项目,代码检测和提交规范都是已经配置好的,最近自己新建的项目就记录下相关配置过程。 1. ESlint配置 2013年6月创建开源项目,提供一个插件化的JavaScript代码检测工具,创建项目是生成的eslintrc.js文…...

Elasticsearch:什么是搜索引擎?
搜索引擎定义 搜索引擎是一种软件程序或系统,旨在帮助用户查找存储在互联网或特定数据库中的信息。 搜索引擎的工作原理是对各种来源的内容进行索引和编目,然后根据用户的搜索查询向用户提供相关结果列表。 搜索引擎对于希望快速有效地查找特定信息的用…...

人工智能几个关键节点:深蓝,AlphaGo,ChatGPT,Sora
近30年,人工智能几个关键节点:深蓝,AlphaGo,ChatGPT,Sora 深蓝: 1997年,深蓝击败卡斯帕罗夫的比赛是通过一系列复杂的算法和策略实现的。深蓝的开发团队使用了一种名为“暴力搜索”的技术&…...

WordPres Bricks Builder 前台RCE漏洞复现(CVE-2024-25600)
0x01 产品简介 Bricks Builder是一款用于WordPress的开发主题,提供直观的拖放界面,用于设计和构建WordPress网站。它使用户能够轻松创建自定义的网页布局和设计,无需编写或了解复杂的代码。Bricks Builder具有用户友好的界面和强大的功能,使用户可以通过简单的拖放操作添加…...

代码随想录算法训练营总结 | 慢慢总结,想起啥就先写上
二叉树总结 二叉树的结构 stauct TreeNode {int val;TreeNode* left;TreeNode* right; }二叉树的递归函数分析 二叉树的递归函数当做只有一个根节点,一个左子树,一个右节点的数去看,这看着是个废话, 其实很重要 回溯…...

基于开源模型对文本和音频进行情感分析
应用场景 从商品详情页爬取商品评论,对其做舆情分析;电话客服,对音频进行分析,做舆情分析; 通过开发相应的服务接口,进一步工程化; 模型选用 文本,选用了通义实验室fine-tune的st…...

SQL中为什么不要使用1=1
最近看几个老项目的SQL条件中使用了11,想想自己也曾经这样写过,略有感触,特别拿出来说道说道。 编写SQL语句就像炒菜,每一种调料的使用都可能会影响菜品的最终味道,每一个SQL条件的加入也可能会影响查询的执行效率。那…...

python 几种常见的音频数据读取、保存方式
1. soundfile 库的使用 soundfile库是一个Python库,主要用于读取和写入音频文件。它支持多种音频格式,包括WAV、AIFF、FLAC和OGG等。通过soundfile库,用户可以方便地将numpy数组存储到音频文件或者将音频文件加载到numpy数组中。此外&#x…...

关于msvcr120.dll丢失怎样修复的详细解决步骤方法分享,msvcr120.dll文件的相关内容
在电脑使用过程中,我们经常遇到各种系统错误,其中msvcr120.dll丢失是一个常见问题。msvcr120.dll文件是Visual C Redistributable for Visual Studio 2015/2017的一个组件,主要用于支持某些应用程序的正常运行。当电脑出现msvcr120.dll丢失情…...

简单几步通过DD工具把云服务器系统Linux改为windows
简单几部通过DD安装其他系统,当服务器的web控制台没有我们要装的系统,就需要通过DD(Linux磁盘)工具来更改系统,(已知支持KVM系统) 本文如何简单的更换系统,不通过web控制台来更换&a…...

使用 package.json 配置代理解决 React 项目中的跨域请求问题
使用 package.json 配置代理解决 React 项目中的跨域请求问题 当我们在开发前端应用时,经常会遇到跨域请求的问题。为了解决这个问题,我们可以通过配置代理来实现在开发环境中向后端服务器发送请求。 在 React 项目中,我们可以使用 package…...

生成 Let‘s Encrypt 免费证书
文章目录 1. 安装 acme.sh2. 添加云服务商安全访问密钥并授权管理DNS记录3. 当前 Shell 添加安全访问密钥变量4. 生成证书5. 拷贝证书6. 清理安全访问密钥变量7. 打开脚本自动更新 代码仓库地址:https://github.com/Neilpang/acme.sh 1. 安装 acme.sh yum -y insta…...

int128的实现(基本完成)
虽然有一个声明叫_int128但是这并不是C标准: long long 不够用?详解 __int128 - FReQuenter - 博客园 (cnblogs.com) 网络上去找int128的另类实现方法,发现几乎都是在介绍_int128的 然后我就自己想了个办法,当时还没学C…...

【linux】使用 acme.sh 实现了 acme 协议生成免费的SSL 证书
acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书. 主要步骤: 安装 acme.sh生成证书copy 证书到 nginx/apache 或者其他服务更新证书更新 acme.sh出错怎么办, 如何调试 下面详细介绍. 1. 安装 acme.sh 安装很简单, 一个命令: curl https://get.acme.sh | sh…...

MACOS上面C/C++获取网卡索引,索引获取网卡接口名
依赖函数: if_nametoindex IF名字 to IF索引 if_indextoname IF索引 to IF名字 MACOS 10.7 版本支援(就是2011年发不OSX的第一个面向用的系统版本) int GetInterfaceIndex(const ppp::string& ifrName) noexcept{if (ifrName.empt…...