4.JVM-垃圾回收介绍
记录个人学习中记录笔记,如有错误请您指正,谢谢🙏
垃圾回收器发展史
传统垃圾回收: 分代回收 不同代有不同的垃圾回收机制
保底

标记清除算法
垃圾识别算法
引用计数法
缺陷:下图2 出现循环引用 无法解决

可达性分析
大部分(Java,python,go等)都在用这种方式
常见的根对象(GCRoots):
- 方法区中的常量引用的对象
- 方法区中的类静态属性引用的对象
- 本地方法栈中JNI的引用的对象
- 虚拟机栈(栈帧中的本地变量表)中引用的对象

垃圾清除算法
标记-清除法 (基本不用)
问题: 容易产生无法使用的内存碎片
比如标记可用块每块2MB,实际使用1.9MB,剩余0.1MB就是内存碎片,无法处理
复制法 (适合新生代)
问题:浪费内存空间
存货对象少垃圾对象多的前提下效果好

标记-压缩算法 (适合老年代)
问题:速度慢

三种清除方法比较


新生代垃圾回收器
GC日志内容
/*** jdk17: -Xlog:gc*=info:stdout:time,uptime,level,tags* jdk8:* -Xmx20M* -Xmn10M* -XX:+PrintGCDetails* -XX:+UseSerialGC* -XX:+PrintGCTimeStamps* -XX:+PrintGCDateStamps # 绝对时间* -XX:SurvivorRatio=8*/
public class GC_Serial {/*-Xmx20M-Xmn10M-XX:+PrintGCDetails-XX:+UseSerialGC-XX:+PrintGCTimeStamps-XX:SurvivorRatio=8*/private static final int size = 1024 * 256;public static void main(String[] args) {
// System.gc();for (int i = 0; i < 30; i++) {byte[] date = new byte[size];}}/*** Allocation Failure: // 分配内存失败* metadata space exhausted: // 元数据空间耗尽* system.gc() invoked: // 调用了System.gc() => full gc*//*** 各种垃圾回收器常见的类型:* serial => DefNew* parNew => ParNew* Parallel => PSYoungGen* Parallel Old => ParoldGen*/}
- def new generation:新生代
- tenured generation:老年代
- metaspace:元空间
- committed:下次分配可以分配多大空间
- reserved:最大可用空间多大
0.709: [GC (Allocation Failure) 0.709: [DefNew: 8153K->731K(9216K), 0.0017122 secs] 8153K->731K(19456K), 0.0018048 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heapdef new generation total 9216K, used 3021K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)eden space 8192K, 27% used [0x00000000fec00000, 0x00000000fee3c460, 0x00000000ff400000)from space 1024K, 71% used [0x00000000ff500000, 0x00000000ff5b6fc8, 0x00000000ff600000)to space 1024K, 0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)tenured generation total 10240K, used 0K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)the space 10240K, 0% used [0x00000000ff600000, 0x00000000ff600000, 0x00000000ff600200, 0x0000000100000000)Metaspace used 3226K, capacity 4486K, committed 4864K, reserved 1056768Kclass space used 332K, capacity 386K, committed 512K, reserved 1048576K
Serial串行回收器-最基本的垃圾回收器
- 新生代 SerialNew 老年代 SerialOld
- 新生代使用
<font style="background-color:#FBDE28;">复制算法</font>老年代采用<font style="background-color:#FBDE28;">标记压缩</font>

测试代码
/*-Xmx20M-Xmn10M-XX:+PrintGCDetails-XX:+UseSerialGC-XX:+PrintGCTimeStamps-XX:SurvivorRatio=8*/private static final int size = 1024 * 256;public static void main(String[] args) {
// System.gc();for (int i = 0; i < 30; i++) {byte[] date = new byte[size];}}/*** Allocation Failure: // 分配内存失败* metadata space exhausted: // 元数据空间耗尽* system.gc() invoked: // 调用了System.gc() => full gc*//*** 各种垃圾回收器常见的类型:* serial => DefNew* parNew => ParNew* Parallel => PSYoungGen* Parallel Old => ParoldGen*/
- def new generation:新生代
- tenured generation:老年代
- metaspace:元空间
- committed:下次分配可以分配多大空间
- reserved:最大可用空间多大
0.709: [GC (Allocation Failure) 0.709: [DefNew: 8153K->731K(9216K), 0.0017122 secs] 8153K->731K(19456K), 0.0018048 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heapdef new generation total 9216K, used 3021K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)eden space 8192K, 27% used [0x00000000fec00000, 0x00000000fee3c460, 0x00000000ff400000)from space 1024K, 71% used [0x00000000ff500000, 0x00000000ff5b6fc8, 0x00000000ff600000)to space 1024K, 0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)tenured generation total 10240K, used 0K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)the space 10240K, 0% used [0x00000000ff600000, 0x00000000ff600000, 0x00000000ff600200, 0x0000000100000000)Metaspace used 3226K, capacity 4486K, committed 4864K, reserved 1056768Kclass space used 332K, capacity 386K, committed 512K, reserved 1048576K
ParNew回收器
- 只能在新生代使用,一般配合老年代 CMS 回收器,比Serial多了并行回收

测试代码
/*-Xmx20M-Xmn10M-XX:+PrintGCDetails-XX:+UseParNew-XX:+PrintGCTimeStamps-XX:SurvivorRatio=8*/private static final int size = 1024 * 256;public static void main(String[] args) {
// System.gc();for (int i = 0; i < 30; i++) {byte[] date = new byte[size];}}/*** Allocation Failure: // 分配内存失败* metadata space exhausted: // 元数据空间耗尽* system.gc() invoked: // 调用了System.gc() => full gc*//*** 各种垃圾回收器常见的类型:* serial => DefNew* parNew => ParNew* Parallel => PSYoungGen* Parallel Old => ParoldGen*/
Parallel回收器
JDK8默认的回收器
- Paralle和ParNew机制类似,通过自适应调节来决定回收时机、和回收频率,达到“吞吐量”有限
- 和ParNew的区别在于,进入“SafePoints”的时机不一样
- 在年轻代叫做ParalleNew 老年代叫做 ParalleOld


老年代垃圾回收期
Parallel Old:3.4部分介绍
Serial Old:3.2部分介绍
CMS回收器
没有一个jdk版本设置他默认清理器
JDK14已经移除
优点:
- 并发收集
- 停顿时间短
缺点:
- **处理器资源非常敏感: **收集过程中会开启多个线程
- 会产生浮动垃圾:在并发标记和并发清理阶段,用户线程产生的新垃圾,可能出现Concurrent Model Failure失败而导致另一次Fu GC的产生
- 空间碎片过多:因为采用的标记清除算法,会产生标记清除算法的问题

初始标记(step-1)
会STW

并发标记(step-2)

重新标记(step-3)
会STW

并发清除(step-4)

CMS 回收过程
初始标记
新生代引用的老年代的活的对象

并发标记
标记第一步找出的GC Roots节点,往下遍历

预清理阶段
将第一步第二步没有引用的节点提前标记,本质第一步第二步的增量操作
为的是减少重新标记的时间

可中断的预处理
把重新标记的工作提前做

重新标记
DirtyCard: 预清理阶段,检查看看是否需要清理

并发清理

并发重置

其他问题
MinorGC vs YoungGC
一样的概念,都是针对 年轻代或者叫做新生代的清理
FullGC vs OldGC
G1之前两者都是一样的,都是老年代的垃圾回收
FullGC 表示 新生代老年代永久代的清理更合理
MajorGC
含义不清
FullGC什么时候出发

System.gc()
手动触发FullGC
相关文章:
4.JVM-垃圾回收介绍
记录个人学习中记录笔记,如有错误请您指正,谢谢🙏 垃圾回收器发展史 传统垃圾回收: 分代回收 不同代有不同的垃圾回收机制 保底 标记清除算法 垃圾识别算法 引用计数法 缺陷:下图2 出现循环引用 无法解决 可达性分析 大部分(Java,pytho…...
Redis-锁-商品秒杀防止超卖
一、秒杀(Seckill) 1. 定义 秒杀:短时间内(如1秒内)大量用户同时抢购 限量低价商品 的营销活动。典型场景:双11热门商品抢购、小米手机首发、演唱会门票开售。 2. 技术挑战 挑战点说明后果…...
PostgreSQL 多数据库集簇配置及多数据库复制方法【流程+代码实例】
PostgreSQL 多数据库集簇配置及多数据库复制方法 1. 多数据库集簇配置 安装下载完postgresql后,系统此时包含一个postgres用户和一个名为postgres的默认数据库。 PostgreSQL 基本命令 服务管理命令 # 停止和启动及重启PostgreSQL服务 sudo systemctl stop postgr…...
【k8s004】 Docker 打包 K8s镜像
文章目录 一. 准备工作1. 安装 Docker: [官方安装文档](https://docs.docker.com/get-docker/)2. 准备应用代码(示例使用 Node.js 应用) 二. 创建 Dockerfile3、构建镜像(注意最后的点号)4、测试运行5、推送镜像到仓库6、 Kuberne…...
std::invoke详解
基础介绍 c17版本引入了std::invoke特性,这是一个通用的调用包装器,可以统一调用: 普通函数成员函数函数对象Lambda表达式指向成员的指针 它的主要作用是提供一个统一的方式来调用各种可调用对象。 std::invoke依赖的头文件:#…...
第一个vue项目
项目目录 启动vue项目 npm run serve 1.vue.config.js文件 (CLI通过vue-cli-serve启动项目,解析配置配置文件vue-condig-js) // vue.config.js //引入path板块,这是Node.js的一个内置模块,用于处理文件路径,这里引用…...
基于CNN的多种类蝴蝶图像分类
基于CNN的多种类蝴蝶图像分类🦋 基于卷积神经网络对64992786张图像,75种不同类别的蝴蝶进行可视化分析、模型训练及分类展示 导入库 import pandas as pd import os import matplotlib.pyplot as plt import seaborn as sns import numpy as np from …...
Unity插件-适用于画面传输的FMETP STREAM使用方法(三)基础使用
目录 一、插件介绍 二、组件介绍 三、Game View Streaming 1、使用 FM Network UDP 的基本设置 Server Scene Client Scene 2、使用使用 FM WebSocket 的基本设置 四、Audio Streaming 五、Microphone Streaming 一、插件介绍 Unity插件-适用于画面传输的…...
微信小程序wx.request接口报错(errno: 600001, errMsg: “request:fail -2:net::ERR_FAILED“)
来看看报错 报错如下: 请求发送部分,代码如下: uni.request({url: self.serverUrl "/getRealName",method: GET,data: {"code": self.info.code,},header: {"Authorization": uni.getStorageSync(tokenHead) uni.getStorageSync(token)}}…...
使用Docker快速搭建OpenAI兼容的Embeddings与Rerank双API服务
使用Docker快速搭建OpenAI兼容的Embeddings与Rerank双API服务 前言环境准备硬件要求软件依赖双服务部署指南1. Embeddings API部署启动容器参数说明2. Rerank API部署启动容器服务验证与测试通用验证方法1. Embeddings API测试请求示例响应特征2. Rerank API测试请求示例响应解…...
基于Python+MySQL编写的(WinForm)图书管理系统
一、项目需求分析 1.1 项目介绍 项目背景 图书馆管理系统是一些单位不可缺少的部分,书籍是人类不可缺少的精神食粮,尤其对于学校来说,尤其重要。所以图书馆管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管…...
[贪心算法] 摆动序列
1.解析 这里我们的贪心体现在,这里我们只需要找到每一个拐点位置的数字即可, 证明: 当我们在A点时,我们下一步的选择有四种 A到D这个线段内的数字(不包括D)选择D点D到F的点F之后的点 对于A到D来说…...
WPF未来展望:紧跟技术发展趋势,探索新的可能性
WPF未来展望:紧跟技术发展趋势,探索新的可能性 一、前言二、WPF 与.NET 技术的融合发展2.1 拥抱.NET Core2.2 利用.NET 5 及后续版本的新特性 三、WPF 在新兴技术领域的应用拓展3.1 与云计算的结合3.2 融入物联网生态 四、WPF 在用户体验和设计方面的创新…...
低空经济腾飞:无人机送货、空中通勤,未来已来
近年来,低空经济逐渐成为社会关注的焦点。从无人机送货到“空中的士”,再到飞行培训的火热进行,低空经济正迎来前所未有的发展机遇。随着技术进步和政策支持,这一曾经看似遥远的未来场景,正逐步变为现实。 低空经济如何…...
http proxy的原理是什么
Http代理的原理 代理服务器会自动提取请求数据包中的HTTP请求数据发送给服务端,并将服务端的HTTP响应数据转发给发送请求的客户端,HTTP代理服务器使用的端口通常是8080。 对于Web客户端来说,代理扮演的服务器角色,接收请求&…...
Redis--补充类型
目录 一、引言 二、补充类型 1.streams 2.geospatial 3.hyperloglog 4.bitmap 5.bitfields 三、总结 一、引言 在简单学习了redis中的5个数据类型(string,list,hash,set,zset)之后,本篇文…...
关于修改 Ollama 及其模型默认路径、迁移已安装的 Ollama 程序和模型以及重启 Ollama 的操作指南
以下是关于修改 Ollama 及其模型默认路径、迁移已安装的 Ollama 程序和模型以及重启 Ollama 的操作指南,以问答格式呈现,并将涉及命令操作的部分使用代码块按执行顺序和步骤形式展示: Q1:如何修改 Ollama 及其模型的默认路径&…...
QT编译器mingw与msvc区别及环境配置
一.QT编译器mingw与msvc主要区别 二.QT开发环境配置 1. MinGW 配置 安装步骤: 通过 Qt 官方安装器 安装时勾选 MinGW 组件(如 Qt 6.7.0 MinGW 64-bit)。 确保系统环境变量包含 MinGW 的 bin 目录(如 C:\Qt\Tools\mingw1120_64…...
【css酷炫效果】纯CSS实现进度条加载动画
【css酷炫效果】纯CSS实现进度条加载动画 缘创作背景html结构css样式完整代码基础版进阶版 效果图 通过CSS渐变与背景位移动画,无需JavaScript即可创建流体动态进度条。 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u…...
Feedback-Guided Autonomous Driving
Feedback-Guided Autonomous Driving idea 问题设定:基于 CARLA 的目标驱动导航任务,通过知识蒸馏,利用特权智能体的丰富监督信息训练学生传感器运动策略函数 基于 LLM 的端到端驱动模型:采用 LLaVA 架构并添加航点预测头&#…...
图解AUTOSAR_CP_WatchdogDriver
AUTOSAR WatchdogDriver模块详解 AUTOSAR MCAL层看门狗驱动模块详细解析 目录 1. 模块概述2. 架构位置 2.1. 组件架构 3. 主要功能4. API接口5. 配置参数 5.1. 配置模型 6. 错误代码7. 状态管理 7.1. 状态机 8. 处理流程 8.1. 活动流程 9. 操作序列 9.1. 典型操作序列 10. 硬件…...
大数据学习(65)- Hue详解
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
Maven 的核心包
由于前端项目不是核心,阅读 nexus-public 源代码似乎绕远路了。nexus-oss 社区版主要就是集成 maven 的上传包、认证、包解析、包存储这几个核心功能,前端实现重新可以使用新的现代前端工具来提高生产力。故重新疏理一下 maven 的核心机制,即…...
C语言学习笔记(第三部份)
说明:由于所有内容放在一个md文件中会非常卡顿,本文件将接续C_1.md文件的第三部分 整型存储和大小端 引例: int main(void) {// printf("%d\n", SnAdda(2, 5));// PrintDaffodilNum(10000);// PrintRhombus(3);int i 0;int arr[…...
C语言经典代码题
1.输入一个4位数:输出这个输的个位 十位 百位 千位 #include <stdio.h> int main(int argc, char const *argv[]) {int a;printf("输入一个4位数:");scanf("%d",&a);printf("个位:%d\n"…...
深入理解蒸馏、Function Call、React、Prompt 与 Agent
AI基础概念与实操 一、什么是蒸馏二、如何理解Function Call、React、Prompt与Agent(一)Function Call与Agent(二)Agent中的React概念(三)Prompt与Agent的关联 实操演练function callprompt 一、什么是蒸馏…...
CVPR2025自动驾驶端到端前沿论文汇总
自动驾驶 文章目录 自动驾驶前言自动驾驶的轨迹预测论文端到端自动驾驶论文 前言 汇总CVPR2025自动驾驶前沿论文 自动驾驶的轨迹预测论文 Leveraging SD Map to Augment HD Map-based Trajectory PredictionModeSeq: Taming Sparse Multimodal Motion Prediction with Seque…...
Qt6.8实现麦克风音频输入音频采集保存wav文件
一.本文目的 实现在Qt中接收麦克风数据并保存为WAV文件,使用QAudioInput来录音,并使用QFile来保存数据到WAV文件。 开发环境:QT6.8 本文用极简代码实现,核心代码只需不到100行。 二.代码实现...
记录一个SQL自动执行的html页面
在实际工作场景中,需要运用到大量SQL语句更新业务逻辑,对程序员本身,写好的sql语句执行没有多大问题(图1),但是对于普通用户来说还是有操作难度的。因此我们需要构建一个HTML页面(图2࿰…...
分布式唯一ID
微服务 分布式唯一主键ID生成方案_微服务主键生成-CSDN博客 uid-generator-spring-boot-starter 教程-CSDN博客 https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md GitCode - 全球开发者的开源社区,开源代码托管平台...

