一文了解JVM的垃圾回收
Java堆内存结构
java堆内存是垃圾回收器管理的主要区域,也被称为GC堆。
为了方便垃圾回收,堆内存被分为新生代、老年代和永久代。
新创建的对象的内存会在新生代中分配,达到一定存活时长后会移入老年代,而永久代存储的是类的元数据,在JDK1.8之后永久代被元空间取代,元空间不再位于堆内存中,而是位于本地内存,它们都是方法区的实现。
如何判断一个对象是垃圾呢?
堆中几乎存放了所有的对象实例,对堆进行垃圾回收首先是去判断哪些对象是垃圾。
引用计数法
在对象的对象头中会维护一个引用计数器,每有一个地方引用它,计数器就会加1,当断开引用了就会减1,当计数器的值为0时,说明这个对象是个垃圾。
这种方法简单,效率高,但是会有循环引用的问题。如果一个a对象和b对象之间互相引用,除此之外没有任何引用,那么ab对象的引用计数器的值都为1,就得不到释放。
可达性分析算法
以GC Roots对象为起点,向下搜索,节点走过的路劲成为引用链,如果一个对象没有引用链可以到达GC Roots对象,那么这个对象就是垃圾。
哪些对象是GC Roots对象?
- 虚拟机栈中(栈帧中局部变量表)引用的对象
- 本地方法栈中引用的对象
- 方法区中的静态变量和常量引用的对象
- 同步锁持有的对象
引用的类型
判断对象是否是垃圾还与引用的类型有关。
强引用:当我们去new对象的时候,创建的引用就是强引用,如果一个对象具有强引用,垃圾回收器宁愿抛出OOM错误也不会回收这个对象。
软饮用:如果内存充足就不回收,内存不足就会被回收。
弱引用:不管内存充不充足都会被回收。
虚引用:"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
垃圾回收算法
标记-清除算法
通过可达性分析算法找到存活对象,也就是在GC Roots引用链上的对象,标记它们,然后清除未标记的对象。
这种算法的效率较高,而且垃圾回收后有太多内存碎片,如果是数组这种需要连续内存的对象,可能找不到内存空间。
标记-整理算法
找到存活的对象,标记它们,并让它们向同一端移动,然后清除端边界之外的内存。
这种算法解决了内存碎片化的问题,但由于要整理,所以效率不高,适合老年代这种垃圾回收频率不高的场景。
标记-复制算法
标记-复制算法将内存分为相同的两块,只使用其中一块内存,当那一块内存使用完之后,找到存活的对象,标记它们,然后把它们移到另一块内存上,再把之前使用的那块内存全部清除掉。
这种算法效率较高,而且内存没有碎片化,但是内存使用率太低,只有一半。
分代收集算法
通过对象存活时间的不同将内存分为了新生代和老年代。
其中新生代又分为伊甸园区(eden),幸存者区(S0、S1)。
新创建的对象会被分配到eden区,当eden区内存不足时,会采用标记-复制算法将eden区和
s0区(第一次复制没有对象)的存活对象复制到s1区,然后清除eden区和s0区的内存。之后又创建对象,当eden又满了之后就把eden区和s1区的存活对象复制到s0区,清除eden区和s1区的内存。由此循环,如果存活对象多次都没有被回收,会移到老年代中。
为什么要分代收集?为什么堆要被分为新生代和老年代?
因为这样可以根据各个年代的特点选择不同的垃圾回收算法,新生代的对象存活率低,就可以选择标记-复制算法,复制少量存活对象就可以完成垃圾回收;而老年代对象存活率高,不适合复制算法,采用标记-清除或者标记-整理算法。
什么是Minor GC、Full GC?
当进行垃圾回收的时候,会暂停所有线程去完成垃圾回收。
Minor GC :发生在新生代的垃圾回收,当eden区满了会触发,暂停时间较短。
Full GC:对新生代和老年代进行完整的垃圾回收,当老年代内存不足时会触发,暂停时间长,要尽量避免。
垃圾回收器
Serial垃圾回收器
serial垃圾回收器也叫串行垃圾回收器,是一个单线程的垃圾回收期,进行垃圾回收的时候,会暂停其他所有的线程,直到收集结束。
Parallel垃圾回收器
也叫并行垃圾回收器,使用多线程进行垃圾回收,垃圾回收时也会暂停其余所有的线程。
JDK1.8默认使用此垃圾回收器。
CMS垃圾回收器
也叫并发垃圾回收器,它的暂停时间很短,GC线程和用户线程并发工作。
CMS垃圾回收器的回收过程分为四个阶段:
初始标记:去标记和GC Roots对象直接连接的对象,会暂停其余线程,但时间很短。
并发标记:之后根据引用链标记其余的可达对象,不会暂停其余线程。
重新标记:防止在并发标记期间有新对象创建而漏标,会暂停其余线程,暂停时间短。
并发清除:清除未标记的对象,不会暂停其余线程。
G1垃圾回收器
G1垃圾回收器是JDK9之后默认的垃圾回收器。它将内存分为多个区域,每个区域都可以充当eden区,Survivor区,old区,humongous区,其中humongous区专门用于存放大对象。
G1垃圾回收器采用复制算法回收垃圾,主要有两种回收方式:Young GC和Mixed GC
G1垃圾回收流程
Young GC(对年轻代的回收):
首先新创建的对象会被分配到eden区,当eden区内存达到阈值后,触发Young GC,会选一个空区域作为幸存者区,然后将存活对象复制到幸存者区,并释放eden区的内存。
当eden再次达到阈值,触发Young GC,选出一个新的空区域作为幸存者区,将eden区和旧幸存者区的存活对象复制到新幸存者区,并释放eden和旧幸存者区的内存,当经过多次Yong GC后还存活的对象会被复制到老年代。
Mixed GC(对年轻代和部分老年代的回收):
当老年代的内存达到一个阈值之后,会去并发标记老年代中的存活对象,无需暂停用户线程。
然后会去重新标记,防止并发标记导致漏标,此时会暂停用户线程。
之后进行Mixed GC,对年轻代和部分老年代进行垃圾回收。对于年轻代,将eden区和旧幸存者区的存活对象复制到新幸存者区,并释放内存;对于老年代,不会去回收所有的老年代,而是选出存活对象较少的老年代,将它们的存活对象复制到一个新的老年代,然后释放内存。
相关文章:
一文了解JVM的垃圾回收
Java堆内存结构 java堆内存是垃圾回收器管理的主要区域,也被称为GC堆。 为了方便垃圾回收,堆内存被分为新生代、老年代和永久代。 新创建的对象的内存会在新生代中分配,达到一定存活时长后会移入老年代,而永久代存储的是类的元数…...
Vector底层结构和源码分析(JDK1.8)
参考视频:韩顺平Java集合 Vector 类的定义说明: Vector 的底层也是一个对象数组,protected Object[] elementData;Vector 是线程同步的,即线程安全,Vectoe 类的操作方法带有 synchronized 关键字:public sy…...
uni-app+vue3学习随笔
目录相关 static文件 编译器会把static目录中的内容整体复制到最终编译包内, 非 static 目录下的文件(vue组件、js、css 等)只有被引用时,才会被打包编译。 css、less/scss 等资源不要放在 static 目录下,建议这些…...
JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3+ 2025 版免费体验方案
JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3 2025 版免费体验方案 前言 JetBrains IDE 是许多开发者的主力工具,但从 2024.02 版本起,JetBrains 调整了试用政策,新用户不再享有默认的 30 天免费试用…...
移远通信联合德壹发布全球首款搭载端侧大模型的AI具身理疗机器人
在汹涌澎湃的人工智能浪潮中,具身智能正从实验室构想迈向现实应用。移远通信凭借突破性的端侧AI整体解决方案,为AI机器人强势赋能,助力其实现跨行业拓展,从工业制造到服务接待,再到医疗康养,不断改写各行业…...
嵌入式硬件篇---手柄控制控制麦克纳姆轮子
文章目录 前言1. 变量定义2. 摇杆死区设置3. 模式检查4. 摇杆数据处理4.1 右摇杆垂直值(psx_buf[7])4.2 右摇杆水平值(psx_buf[8])4.3 左摇杆水平值(psx_buf[5])4.4 左摇杆垂直值(psx_buf[6]&am…...
XML Schema 实例
XML Schema 实例 引言 XML(可扩展标记语言)是一种用于标记电子文件使其具有结构性的标记语言。XML Schema 是一种用于定义 XML 文档结构的机制,它定义了 XML 文档中允许的数据类型、元素和属性。本文将详细探讨 XML Schema 实例,包括其基本概念、结构、用途以及实例分析。…...
Datax-web部署文档(超详细)
Datax-web部署文档(超详细) Datax部署 # 参考官方文档 https://github.com/alibaba/DataX/blob/master/userGuid.md# 下载datax已经封装好的文件,不推荐源码自己编译 https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.…...
基于javaweb的SSM敬老院养老院管理系统(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
专题地图的立体表达-基于QGIS和PPT的“千层饼”视图制作实践
目录 前言 一、QGIS准备基础数据 1、QGIS 相关插件 2、图层标绘操作 二、PPT中制作 1、调整图片的规格 2、设置旋转 3、添加文字 三、总结 前言 在信息爆炸的时代,数据的可视化呈现变得愈发关键,而专题地图作为传递地理空间信息的有力工具&#…...
DeepSeek-R1 论文阅读总结
1. QA问答(我的笔记) Q1: DeepSeek如何处理可读性问题? 通过构建冷启动数据(数千条长CoT数据)微调基础模型,结合多阶段训练流程(RL训练、拒绝采样生成SFT数据),并优化输…...
如何选择适合您智能家居解决方案的通信协议?
如何选择适合您智能家居解决方案的通信协议? 在开发智能家居产品时,选择合适的通信协议对于设备的高效运行及其在智能家居系统中的互操作性至关重要。市面上协议众多,了解它们的特性并在做决定前考虑各种因素是非常必要的。以下是一些帮助您…...
蓝桥杯备考:set容器用法(lower_bound)---营业额统计
如图所示,这道题的暴力解法就是枚举每天的营业额,让该营业额和前面的天的营业额依次相减取最小值这样的话我们的时间复杂度就是N平方,我们是很有可能超时的 所以我们选择用set容器的二分查找功能 我们每次遍历到一个数的时候,前…...
vue3 动态添加路由并生成左侧菜单栏
先说下思路,登录后跳转到基础页面, 每访问一个页面时,会进到路由守卫的方法 守卫进行身份验证,登录成功后才能跳转到静态路由外的页面,否则就重定向回login页面 登录后跳转到基础页面(因为基础页面包含了左…...
上下文微调(Contextual Fine-Tuning, CFT)提高大型语言模型(LLMs)在特定领域的学习和推理能力
大型语言模型(LLMs)在开放领域任务中表现出色,但在快速演变的专业领域(如医学、金融)中面临挑战: 知识更新难题:传统指令微调(Instruction Fine-Tuning, IFT)依赖显式指令,难以适应动态知识。灾难性遗忘:持续预训练(Continued Pretraining, CPT)可能导致模型遗忘已…...
L2-4 吉利矩阵
输入样例: 7 3输出样例: 666 这道题是暴力纯搜,但是很难想,我这个是看的别人的代码 #include "bits/stdc.h" using namespace std; int x[20][20]; int l, n; int cnt 0; int sumx[5], sumy[5]; void dfs(int x, in…...
⭐算法OJ⭐汉明距离【位操作】(C++ 实现)Hamming Distance
Hamming Distance(汉明距离)是用于衡量两个等长字符串在相同位置上不同字符的个数的度量。它通常用于比较两个二进制字符串或编码序列的差异。 定义 给定两个长度相同的字符串 A A A 和 B B B,它们的汉明距离 D ( A , B ) D(A,B) D(A,B)…...
数据可信、隐私可控:CESS 如何打造波卡生态数据新基建?
原文:https://messari.io/report/cess-network-a-deep-dive-into-programmable-data-value-infrastructure作者:Messari编译:OneBlock波卡生态一直以来以其跨链互操作性和灵活性吸引了众多创新项目,尤其是在 DePIN(去中…...
HCIA-11.以太网链路聚合与交换机堆叠、集群
链路聚合背景 拓扑组网时为了高可用,需要网络的冗余备份。但增加冗余容易后会出现环路,所以我们部署了STP协议来破除环路。 但是,根据实际业务的需要,为网络不停的增加冗余是现实需要的一部分。 那么,为了让网络冗余…...
网络安全之数据加密(DES、AES、RSA、MD5)
刚到公司时,我的工作就是为app端提供相应的接口。之前app使用的是PHP接口,对数据加密方面做得比较少。到使用java接口时,老大开始让我们使用DES加密,进行数据传输,但是后来觉得DES是对称加密,密钥存在客户端…...
Vim忍者速成秘卷:让你的键盘冒出残影の奥义
🎯 核心原理 通过 超低延迟配置 + 肌肉记忆优化 + 视觉欺骗技术,达成行云流水的操作体验。就像《火影忍者》结印般流畅! ⚡ 残影生成术(基础篇) " 🛩️ 贴地飞行模式(.vimrc 极速配置) set timeoutlen=300 " 快捷键响应时间压缩至300ms(武士刀级响应)…...
致远互联FE协作办公平台 存在SQL注入漏洞(DVB-2025-8942)
免责声明 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x01…...
通俗易懂动态表单自定义字段解决方案
动态表单自定义字段解决方案 1. 背景: 有些项目可能会有要求,客户可以自定义设计字段,并且字段还需要在后台设置可展示、可搜索。 2. 场景: 比如说报名场景,我们并不知道客户想让用户填哪些东西。下面我就举个例子&…...
CentOS7离线部署安装Dify
离线部署安装Dify 在安装 Dify 之前,请确保您的机器满足以下最低系统要求: CPU > 2 核 内存 > 4 GiB 1.安装docker和docker compose 启动 Dify 服务器最简单的方式是通过docker compose。因此现在服务器上安装好docker和docker compose…...
Dify后端结构与二次开发指南(一)
Dify 的后端基于 Python 编写,使用 Flask 作为 Web 框架,SQLAlchemy 作为 ORM(对象关系映射),Celery 作为任务队列,Flask-Login 处理用户认证和授权。以下是对 Dify 后端结构的详细介绍,以及如何…...
vscode arm拓展 keil acm5 到acm6迁移
目录 1. Arm Keil Studio Visual Studio 代码扩展用户指南(only support acm6 project)(能不迁移还是别迁移了,工程量太大啦,会出很多问题的) 1. Arm Keil Studio Visual Studio 代码扩展用户指南ÿ…...
软件工程概述、软件过程模型、逆向工程(高软45)
系列文章目录 软件工程概述、软件过程模型、逆向工程。 文章目录 系列文章目录前言一、软件工程概述二、能力成熟度模型1.能力成熟度模型CMM2.能力成熟度模型集成CMMI 三、软件过程模型1.瀑布模型SDLC2.原型化模型3.螺旋模型4.增量模型5.喷泉模型6.敏捷模型7.统一过程模型RUP 四…...
医药制造行业现状 医药制造行业内检实验室LIMS
在医药制造行业中,质量控制是确保产品安全性和有效性的关键环节。随着科技的进步和监管要求的日益严格,传统的实验室信息管理系统(LIMS)已经难以满足现代医药制造企业对高效、精准管理的需求。面对这一挑战,白码内检实…...
FX-std::list
std::list 是 C 标准库中的一个双向链表容器,定义在 <list> 头文件中。它支持在任意位置高效地插入和删除元素,但不支持随机访问。以下是 std::list 的基本用法和一些常见操作: 1. 包含头文件 #include <list> 2. 定义和初始化…...
配置安全网站
配置网站 确定是Debian系统 更新索引:apt update 安装包:apt upgrade -y 查看nginx状态:systemctl status nginx 安装:nginx:apt install nginx 启动:systemctl start nginx 在/var/www/里面创建一个…...
C/C++中对字符处理的常用函数
C语言中的 ctype.h 头文件提供了一系列字符分类和转换函数,用于高效处理字符相关操作。这些函数通过接受 int 类型参数(需为 unsigned char 或 EOF (-1)值),返回非零值表示条件正确,返回0表示错…...
深度学习分词器char-level实战详解
一、三种分词器基本介绍 word-level:将文本按照空格或者标点分割成单词,但是词典大小太大 subword-level:词根分词(主流) char-level:将文本按照字母级别分割成token 二、charlevel代码 导包࿱…...
根据开始和结束日期,获取每一天和每个月的开始和结束日期的list
获取开始日期与结束日期之间每天的list /*** 根据传入的开始时间和结束时间,筛选出所有的天的list;** param startTime* param endTime*/public Map<String, List<String>> fetchDayListBetweenStartAndEnd(String startTime, String endTime) {// 创建mapMap<…...
实时采集到的语音进行语音识别
要在.NET Framework 4.8中使用C#实现离线实时语音识别,可以使用开源库Vosk(支持离线ASR)配合音频处理库NAudio。 步骤 1:安装依赖库 1.1. 安装NuGet包: - Install-Package NAudio(处理音频输入)…...
《苍穹外卖》SpringBoot后端开发项目核心知识点与常见问题整理(DAY1 to DAY3)
目录 一、在本地部署并启动Nginx服务1. 解压Nginx压缩包2. 启动Nginx服务3. 验证Nginx是否启动成功: 二、导入接口文档1. 黑马程序员提供的YApi平台2. YApi Pro平台3. 推荐工具:Apifox 三、Swagger1. 常用注解1.1 Api与ApiModel1.2 ApiModelProperty与Ap…...
【从零开始学习计算机科学】数据库系统(十一)云数据库、NoSQL 与 NewSQL
【从零开始学习计算机科学】数据库系统(十一)云数据库、NoSQL 与 NewSQL 云数据库云服务器的服务云数据库和传统的分布式数据库的异同NoSQLNoSQL数据库的特点CAP定理NoSQL的特性NoSQL数据库的分类NoSQL的适用场景Nosql数据库实例-RedisRedis的优势MongoDBMongoDB的特点NewSQL…...
Linux入门 全面整理终端 Bash、Vim 基础命令速记
Linux入门 2025 超详细全面整理 Bash、Vim 基础命令速记 刚面对高级感满满的 终端窗口是不是有点懵?于是乎,这份手册就是为你准备的高效学习指南!我把那些让人头大的系统设置、记不住的命令都整理成了对你更友好的格式,让你快速学…...
LInux基础--apache部署网站
httpd的安装 yum -y install httpdhttpd的使用 启动httpd systemctl enable --now httpd使用enable --now 进行系统设置时,会将该服务设置为开机自启并且同时开启服务 访问httpd 创建虚拟主机 基于域名 在一台主机上配置两个服务server1和server2,其…...
重生之我在学Vue--第12天 Vue 3 性能优化实战指南
重生之我在学Vue–第12天 Vue 3 TypeScript 类型系统深度整合 文章目录 重生之我在学Vue--第12天 Vue 3 TypeScript 类型系统深度整合前言一、TypeScript与Vue3的集成1.1 项目初始化配置1.2 类型配置文件解析 二、类型声明实战2.1 Props类型约束2.2 Emit事件类型2.3 组合式AP…...
Go 语言封装 HTTP 请求的 Curl 工具包
文章目录 Go 语言封装 HTTP 请求的 Curl 工具包🏗️ 工具包结构简介核心结构体定义初始化函数 🌟 功能实现1. 设置请求头2. 构建请求3. 发送请求4. 发送 GET 请求5. 发送 POST 请求6. 发送 PUT 请求7. 发送 DELETE 请求8. 读取响应体 💡 实现…...
【Go】Go MongoDB 快速入门
1. MongoDB 简介 1.1 MongoDB 介绍 由于我们时常需要存储一些大文本数据(比如文章内容),存储到一些关系型数据库可能不是最好的选择,这个时候就需要引入一些 NoSQL(Not Only SQL),比如 MongoD…...
Java --- 根据身份证号计算年龄
介绍 根据身份证号计算年龄 Java代码 /*** 根据身份证号计算年龄* param birthDateStr* return*/public static int calculateAge(String birthDateStr) {try {birthDateStrbirthDateStr.substring(6,68);// 定义日期格式SimpleDateFormat sdf new SimpleDateFormat("…...
[LeetCode热门100题]|137,260,268,面试17.19
1、137 只出现一次数字|| 1、题目描述 137 只出现一次数字||https://leetcode.cn/problems/single-number-ii/description/ 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你…...
WPF未来展望:紧跟技术发展趋势,探索新的可能性
WPF未来展望:紧跟技术发展趋势,探索新的可能性 一、前言二、WPF 与.NET 技术的融合发展2.1 拥抱.NET Core2.2 利用.NET 5 及后续版本的新特性 三、WPF 在新兴技术领域的应用拓展3.1 与云计算的结合3.2 融入物联网生态 四、WPF 在用户体验和设计方面的创新…...
maxwell
一、maxwell简介 它是一款轻量级工具,主要用于实现 MySQL 到 Kafka 的数据实时同步,尤其适合对实时性要求较高的场景。 1.核心功能 借助解析 MySQL 的 Binlog,能够实时捕获数据变更,并将这些变更数据发送至 Kafka。 2.缺点 仅…...
Qt 6.6.1 中 QPixmap::grabWindow() 的用法与替代方案
一、Qt 6 中的 API 变化 弃用 QPixmap::grabWindow() 在 Qt 6 中,QPixmap::grabWindow() 已被迁移至 QScreen 类,需通过 QScreen::grabWindow() 实现窗口截取。 原因: Qt 6 重构了图形模块,QPixmap 的截屏功能被整合到 QSc…...
【软件】免费的PDF全文翻译软件,能保留公式图表的样式
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 很多PDF全文翻译软件都是收费的,而划线翻译看着又很累。这个开源的PDF全文翻译软件非常好用,并且能够保留公式、图表、目录和注…...
LeetCode 112. 路径总和 II java题解
https://leetcode.cn/problems/path-sum/description/ class Solution {boolean resfalse;//记录结果public boolean hasPathSum(TreeNode root, int targetSum) {if(rootnull) return res;int sum0;find(root,sum,targetSum);return res;}public void find(TreeNode root,int…...
如何快速定位导致服务器卡顿的进程
在 Linux 系统中,可以通过多种方式快速定位导致服务器卡顿的进程。以下是一些常用的方法: 1. 使用 top 和 htop 命令: 使用 top 或 htop 命令可以实时监视系统资源利用情况,包括 CPU 和内存占用情况,以及运行的进程列…...
【计算机网络】第八版和第七版的主要区别,附PDF
「《计算机网络》(... 谢希仁」,https://pan.quark.cn/s/7c2147cb48f7 1. 新增内容 - 软件定义网络(SDN):第八版在网络层章节中新增了对SDN的简介(第4章),介绍了其基本原理和应用。 - Wi-Fi代…...