当前位置: 首页 > article >正文

【学习笔记】深入理解Java虚拟机学习笔记——第3章 垃圾收集器与内存分配策略

第3章 垃圾收集器与内存分配策略

3.1 概述

3.2 对象已死?

“死去”即不可能以任何途径访问到

3.2.1 引用计数算法

每个对象维护一个计数器,引用即加1,引用失效便减1。

3.2.2 可达性分析算法(主流)

即根据GC Roots是否可由引用链到达
-Java GC Roots:
1>虚拟机栈的栈帧中的变量表、参数、局部及临时变量
2>方法区静态引用对象
3>方法区常量引用对象(String常量池,static修饰的对象)
4>本地方法栈所引用的对象
5>虚拟机内部引用:基本数据类型、class对象、常驻异常对象、系统类加载器等。
6>被同步锁持有的对象
7>本地代码缓存等

3.2.3 再谈引用

1.强引用:传统赋值引用,只要强引用还在,GC便不会回收被强引用的对象。
2.软引用:还有用、非必须。只被软引用的对象在OOM之前会对软引用对象做回收,若回收之后还没有足够的内存才会出现OOM异常。
3.弱引用:只被弱引用的对象,在GC时一定会回收。
4.虚引用:无引用关系,只会在GC回收时通知。

3.2.4 生存还是死亡

第一次标记为不可达之后,会执行对象Finalize方法,之后进行第二次不可达标记(针对于执行finalize的对象),若在finalize中重新加上了对this的引用,则不会被回收,即两次标记才会被回收。
【finalize只会被调用一次,且不建议使用】

3.2.5 回收方法区

常量池部分不使用了会自动回收。
-类型卸载的许可条件:
1>class所有的实例已被回收
2>类加载器已被回收(很苛刻,一般只有JSP等才会符合)
3>java.lang.class未被引用
【1.以上类是否允许回收可以通过–Xnoclassgc参数控制
2.在大量使用了JSP或者反射的项目中,通常需要类卸载的能力】

3.3 垃圾收集算法

主流的垃圾收集算法为追踪式垃圾收集

3.3.1 分代收集理论

1>大部分对象朝生夕死
2>越没被回收,越难以磨灭
3>跨代引用只占少数

3.3.2 标记-清除算法

先标记(可达性算法),再清除

3.3.3 标记-复制算法

新生代中:新对象分配入end区。yong GC时存活的对象放入S0,下一次yong GC会把S0和eden存活的对象放入S1。
【大小比值-> eden:S0 = 8:1】

3.3.4 标记-整理算法

标记后,移动存活对象到相邻的区域

3.4 HotSpot的算法细节实现

3.4.1 根节点枚举

在类加载与即时编译时便会把记录在Map中,实际GC时可以不必完全依靠遍历方法区

3.4.2 安全点

导致OopMap或者说对象引用关系变化的操作非常多,虚拟机会在例如方法调用、循环跳转、异常跳转等可能长时间执行的命令执行时产生安全点,在这些安全点可以执行GC操作,而用户线程通过轮询GC标志位来知晓应该在下一个安全点停下。

3.4.3 安全区域

线程将引用不变的一段区域设定为安全区域,所以GC线程不必等待某些sleep与blook线程进入安全点。

3.4.4 记忆集与卡表

1>好处:为了避免每次GC时都将老年代整个加入扫描范围,知道某一块儿非收集区域有指向一块需要收集区域的指针便可以将该非收集区域的对象加入GCRoots中一并扫描。
2>实现:HotSpot用一个数组来映射JVM中收集区域的内存地址。用数组中的一个元素的0与1表示映射内存地址是否存在脏元素(跨带引用)。

3.4.5 写屏障

写屏障可以在引用赋值前后进行操作,相当于引用赋值的AOP切面,这边在引用赋值时利用写屏障更新卡表中对应页的跨带引用情况。

3.4.6 并发的可达性分析

对象标记:
白色(未标记/不可达)
灰色(正进行引用可达性分析)
黑色(引用可达性分析完毕,可达)
在并发标记时,使用以下两种方法规避标记时的引用变化。
1>在黑色对象插入插入对白色对象的引用后,它变为灰色对象
2>无论引用关系删除与否,都会按照刚开始扫描时那一刻的对象图快照来进行搜索

3.5 经典垃圾收集器

(收集器关系图P90)
【并发:物理上同时;并行:逻辑上同时】

3.5.1 Setial收集器

最基础历史最悠久,单线程收集,stop用户线程的新生代收集器。
优点:简单而高效(redis理念),占用内存少,单核。
适用:客户端等使用内存较少的场景。

3.5.2 ParNew收集器

并行多线程版本的Serial新生代收集器
优点:多核CPU适应
适用:与CMS old收集器协同适用

3.5.3 Parallel Scarenge收集器

并行多线程:新生代收集器
优点:可通过JVM参数设置GC停顿时间、GC吞吐量(GC与用户代码运行时间的比值)
适用:对吞吐量有要求的情况(一般为处理器资源有限的计算程序)

3.5.4 Serial old 收集器

单线程老年代收集器
优点:简单高效,适合客户端
适用:客户端内存小,CPU单核长假

3.5.5 Parallel old 收集器

吞吐量、并发 old收集器
优点:同 Parallel Scarenge Young
适用:同上,并与Parallel Scarenge Young协同适用以获取最优吞吐量。
【响应时间与吞吐量不可兼得,除非无限制提升硬件】

3.5.6 CMS收集器

低响应延迟的CMS old收集器
优点:通过并行标记将大部分可达性标记与用户代码同时进行,而不stop the world来通过降低整体计算效率以提高响应速度,且用标记-清除法,可能留下大量碎片而不得不发生full GC
适用:低响应延迟的服务交互场景

3.5.7 Garbage First 收集器

化整为零,分区回收的G1
优点:大部分标记工作可以与用户线程并行,将堆分区为多个region,每个region可以是eden,s1,s0,或者是老年代,对每个region单独回收,通过参数指定期望的GC停顿时间,在回收时以region为单位,优先回收垃圾多的region
适用:需短暂停顿的服务端应用

【G1在8GB以上的内存消耗下一般表现比CMS好,通过使用更多的cpu与内存资源做分区卡表等额外操作来获得更低的延迟效率】

3.6 低延迟垃圾收集器

低延迟实现的关键在于回收内存时是并发的。主要通过对象的转发指针二次访问实现。

3.5.2 ZGC收集器

通过对象指针的高四位表示对象状态,略。

3.7 选择合适的垃圾收集器

3.7.1 Epsilon收集器

特点:只做堆等内存分配,不回收
适用:测试、运行时间短等不必GC的场景

3.7.2 收集器的权衡

老JDK、4GB-6GB一般使用CMS,更大则使用G1
【要实验,不可以纸上谈兵,P122】

3.7.3 虚拟机及垃圾收集器日志

日志级别:Trace、Debug、Info、Warning、Error、Off
日志标签:gc
附加信息:P123

3.7.4 垃圾收集器参数总结

p128~P129

3.8 实战:内存分配与回收策略

自动化内存管理:
1>自动给对象分配内存
2>自动回收分配给对象的内存

3.8.1 对象优先在Eden分配

3.8.2 大对象直接进入老年代

可以使用JVM参数指定大对象具体多大

3.8.3 长期存活的对象将进入老年代

经过一次young GC,对象增加一岁,默认15岁后进入老年代

3.8.4 动态对象年龄判定

如果幸存者(s1,s0)中大多数对象处于同年龄,那么大于等于该年龄的对象直接进入老年代

3.8.5 空间分配担保

当老年代可用空间小于新生代时,可通过参数指定,当老年代剩余空间大于youngGC存活平均大小时,尝试先发起youngGC,空间不足再发起full GC(一般可以开启)

相关文章:

【学习笔记】深入理解Java虚拟机学习笔记——第3章 垃圾收集器与内存分配策略

第3章 垃圾收集器与内存分配策略 3.1 概述 略 3.2 对象已死? “死去”即不可能以任何途径访问到 3.2.1 引用计数算法 每个对象维护一个计数器,引用即加1,引用失效便减1。 3.2.2 可达性分析算法(主流) 即根据GC…...

抖去推--短视频矩阵系统源码开发

一、开发短视频矩阵系统的源码需要以下步骤: 确定系统需求: 根据客户的具体业务目标,明确系统需实现的核心功能模块,例如用户注册登录、视频内容上传与管理、多维度视频浏览与推荐、用户互动(评论、点赞、分享&#xf…...

Windows设置之网络路由

在 Windows 系统中,可以通过配置路由表来实现特定 IP 地址通过无线网卡(Wi-Fi)连接,而其他流量通过有线以太网连接。 比如,让101.132.45.129 走无线网卡,其他的走有线以太网的具体步骤如下: 通…...

发送文件脚本源码版本

V1 适配win10和 win11 #SingleInstance Force SendMode Input SetWorkingDir %A_ScriptDir%; Global variables global TaskList : [] global CurrentFileConfig : "current_file.ini" global RemainingFilesConfig : "remaining_files.ini" global File…...

Vue部署到Nginx上及问题解决

一、Vue打包 dist文件即打包文件 二、下载Nginx,将dist内容全部复制到Nginx的html下 三、修改Nginx的nginx.conf配置文件,添加try_files $uri $uri/ /index.html; try_files $uri $uri/ /index.html; 是 Nginx 配置中的一个重要指令,用于处理…...

MCP(Model Context Protocol)与提示词撰写

随着大模型(LLM)在复杂任务中的普及,如何让模型高效调用外部工具和数据成为关键挑战。传统函数调用(Function Calling)依赖开发者手动封装 API,而 MCP(Model Context Protocol) 通过…...

每日一令:Linux 极简通关指南 - 汇总

专栏列表 💻 每日一令:Linux 极简通关指南 (25篇) 【基础】每天掌握一个Linux命令 - nsenter:深入容器与命名空间的利器 发布于 2025-06-08 22:27:04【基础】 每天掌握一个Linux命令 - journalctl:系统日志管理的得力助手 发布于…...

项目-- Json-Rpc框架

目录 项目简介环境搭建Ubuntu-22.04 第三方库使用JsonCppMuduo基础类EventLoop类TcpConnection类Buffer类TcpClient类TcpServer类 服务端基本搭建客户端基本搭建 future 项目设计通用模块设计Rpc功能模块设计发现者设计提供者设计服务注册中心设计 Topic功夫模块设计主题管理中…...

因泰立科技H1X激光雷达:因泰立科技为智慧工业注入新动力

在当今工业领域,精准测量与高效作业是推动产业升级的关键因素。因泰立科技推出的H1X三维轮廓扫描激光雷达,凭借其卓越的性能和广泛的应用场景,正成为智慧工业中不可或缺的高科技装备。 产品简介 H1X三维轮廓扫描激光雷达是因泰立科技基于二维…...

day50 随机函数与广播机制

目录 一、随机张量的生成 1.1 torch.randn() 函数 1.2 其他随机函数 1.3 输出维度测试 二、广播机制 2.1 广播机制的规则 2.2 加法的广播机制 二维张量与一维向量相加 三维张量与二维张量相加 二维张量与标量相加 高维张量与低维张量相加 2.3 乘法的广播机制 批量…...

Codeforces Educational 179(ABCDE)

前言 byd这组题纯靠感觉是吧…^_^ b题赛时举了无数个例子都没想明白&#xff0c;然后一直卡到结束&#xff0c;后面题都没看到&#xff0c;结果补题的时候c题d题直接秒了…-_-|| A. Energy Crystals #include <bits/stdc.h> using namespace std;typedef long long …...

基于 actix-web 框架的简单 demo

以下是一个基于 actix-web 框架的简单 demo&#xff0c; 如果你还没有 Rust&#xff0c;我们建议你使用 rustup 来管理你的 Rust 安装。官方 Rust 指南有一个很棒的入门部分。 Actix Web 目前支持的最低 Rust 版本 &#xff08;MSRV&#xff09; 为 1.72。运行 rustup update…...

python:Tkinter 开发邮件客户端,能编写邮件,发送邮件带附件

Python Tkinter 邮件客户端 下面是一个使用 Python Tkinter 开发的简单邮件客户端&#xff0c;支持编写邮件和发送邮件功能&#xff1a; 功能说明 这个邮件客户端包含以下功能&#xff1a; 邮件编写功能&#xff1a; 收件人地址输入抄送地址输入邮件主题输入邮件正文编辑区&…...

CMake基础:gcc/g++编译选项详解

目录 1.编译步骤 2.gcc 与 g 区别 3.gcc 命令的常用选项 3.1.基础编译选项 3.2.优化选项 3.3.调试与分析选项 3.4.链接选项 3.5.语言特性选项&#xff08;C 特化&#xff09; 3.6.安全增强选项 3.7.架构与指令集优化 3.8.其他常用选项 4.常见编译组合示例 5.常用环…...

深入解析Java21核心新特性(虚拟线程,分代 ZGC,记录模式模式匹配增强)

文章目录 前言一、虚拟线程 (Virtual Threads - JEP 444) - 并发的革命1.1 解决的核心问题&#x1f3af;1.2 工作原理与核心机制⚙️1.3 使用详解与最佳实践&#x1f6e0;️1.4 注意事项⚠️1.5 总结 &#x1f4da; 二、分代 ZGC (Generational ZGC - JEP 439) - 低延迟新高度2…...

免费批量去水印工具 - 针对文心一言生成图片

免费批量去水印工具 - 针对文心一言生成图片 工具介绍 这是一款免费的批量去水印工具&#xff0c;专门针对文心一言生成的图片进行处理。通过简单的操作&#xff0c;您可以快速去除图片中的水印。 下载链接 您可以通过以下网盘链接下载工具&#xff1a; 链接: https://pa…...

android 之 MediaExtractor

MediaExtractor 是Android多媒体处理的基础组件&#xff0c;解封装是其核心价值。 一、功能与定位 MediaExtractor 是Android多媒体框架中的媒体解封装工具&#xff0c;主要作用是从媒体文件&#xff08;如MP4、MKV、MP3&#xff09;中分离音视频轨道数据&#xff0c;为后续解…...

行业案例 | ASOS 借助 Azure AI Foundry(国际版)为年轻时尚爱好者打造惊喜体验

英国潮流电商ASOS借力微软Azure OpenAI&#xff0c;打造生成式AI购物新体验。平台整合大语言模型与推荐引擎&#xff0c;通过智能聊天交互帮年轻用户探索穿搭灵感&#xff0c;精准匹配近900个品牌的潮流单品&#xff0c;实现技术升级与个性化需求的双重突破。 使用 Azure Open…...

在WPS中如何启用宏VBA wps.vba.exe下载和安装

首先我们点击导航栏中的【工具】&#xff0c;点击左侧 运行宏&#xff0c;根据提示 点击 立即加载。加载卡在50%时间比较长&#xff0c;耐心等待。 关闭wps重新打开后&#xff0c; word和xls表格都可以使用了。 如果电脑无法联网&#xff0c;需要提前下载 WPS VBA插件 WPS VB…...

12.7Swing控件5 JProgressBar

Swing 进度条&#xff08;JProgressBar&#xff09;是用于可视化展示任务完成进度的组件&#xff0c;通常用于显示长时间运行任务的完成百分比。以下是关于 Swing 进度条的详细介绍&#xff1a; 1. 基本概念与用途 作用&#xff1a;直观展示任务完成进度&#xff0c;避免用户…...

Hardware-Efficient Attention for Fast Decoding

TL;DR 2025 年普林斯顿大学提出的硬件友好 attention 设计&#xff0c;在 MQA/GQA 与 deepseek 提出的 MLA 基础之上继续优化&#xff0c;提出 Grouped-Tied Attention (GTA) 和 Grouped Latent Attention (GLA)&#xff0c;实现更高推理效率的同时也能保持较好的模型效果。 …...

LLMs 系列科普文(13)

十三、AlphaGO 提到强化学习的历史&#xff0c;不得不提到 alphago&#xff0c;如果你不记得这是什么了&#xff0c;那你是否还曾记得&#xff0c;早些年 AI 已经可以在围棋中击败人类选手了。 AlphaGO 系统又 DeepMind 公司开发&#xff0c;你可以在网络上找到当初人机大战的…...

kubernetes jenkins pipeline优化拉取大仓库性能指定分支+深度

有时候我们历史的git仓库&#xff0c;提交了某个比较大的文件如果不限制 depth &#xff0c;就会拉取所有的历史提交记录&#xff0c;这样在历史仓库比较大的时候 clone 非常之慢&#xff0c;而实际上我们只需要最新的代码来构建就行了&#xff0c;为了优化性能&#xff0c;我们…...

element-plus 单选组件 el-radio,选不上,又没报错,直接复制官网也不行解决方案

在使用 Vue 框架开发项目时&#xff0c;Element UI 是常用的组件库。最近在开发中遇到了 Element 单选框组件el-radio的双向绑定问题&#xff0c;直接复制element官网上的的案例下来也是不得&#xff0c;经过调试和探索&#xff0c;终于找到了解决方案&#xff0c;特此记录分享…...

UDP:简洁高效的报文结构解析与关键注意事项

UDP&#xff08;User Datagram Protocol&#xff09;以其无连接、低开销的特性&#xff0c;成为实时应用&#xff08;如视频、游戏、DNS&#xff09;的首选传输协议。深入理解其报文结构和注意事项&#xff0c;是高效利用UDP的基础。 一、UDP报文结构&#xff1a;简洁的四段式 …...

idea 启动jar程序并调试

添加一个JAR 应用程序&#xff0c;填写以下内容&#xff1a; JAR路径&#xff1a;填写你要启动的jar程序的绝对路径 虚拟机选项&#xff1a;-Xmx1G -Xms1G -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 程序实参&#xff08;可选&#xff0c;minecraft专用…...

CSS 轮廓(Outline)与边框(Border)的深度解析

在 CSS 中&#xff0c;轮廓&#xff08;outline&#xff09;和边框&#xff08;border&#xff09;是两个用于装饰元素的重要属性&#xff0c;但它们在功能、渲染机制和应用场景上存在显著差异。下面从多个维度进行详细对比&#xff1a; 一、基础定义与语法差异 边框&#xf…...

Spring Boot 2 中 default-autowire 的使用

Spring Boot 2 中 default-autowire 的使用 在 Spring Boot 2 中&#xff0c;default-autowire 这个来自传统 XML 配置的概念仍然存在&#xff0c;但它的使用已经大大减少&#xff0c;因为现代 Spring Boot 应用主要使用注解驱动的配置方式。 default-autowire 在 Spring Boo…...

Docker 部署 Python 的 Flask项目

文章目录 一、构建运行 Docker 容器1. 查找合适镜像2.本地docker 拉取镜像3.项目配置1. python项目下生成 requirements.txt 依赖文件2. 生成Dockerfile文件3.忽略不必要文件4. 构建镜像 4. 运行容器5.测试 二、常见问题与解决方案 一、构建运行 Docker 容器 1. 查找合适镜像 …...

12.vite,webpack构建工具

&#x1f63a;&#x1f63a; &#x1f63a;1.vite 介绍和对比 &#x1f3f7;️ Vite 是什么&#xff1f; &#x1f449; Vite 是一个 前端构建工具 开发服务器&#xff0c; 可以帮你&#xff1a; • 开发阶段&#xff1a;秒开项目&#xff0c;改代码能瞬间热更新&#xff08;…...