JVM 核心概念深度解析
最近正在复习Java八股,所以会将一些热门的八股问题,结合ai与自身理解写成博客便于记忆
一、JVM内存结构/运行时数据区
JVM运行时数据区主要分为以下几个部分:
-
程序计数器(PC Register)
- 线程私有,记录当前线程执行的字节码行号
- 唯一不会出现OOM的内存区域
-
Java虚拟机栈(VM Stack)
- 线程私有,存储栈帧(局部变量表、操作数栈、动态链接、方法出口等)
- 可能出现StackOverflowError和OutOfMemoryError
-
本地方法栈(Native Method Stack)
- 线程私有,为Native方法服务
- 同样可能出现StackOverflowError和OutOfMemoryError
-
Java堆(Heap)
- 线程共享,存放对象实例和数组
- GC主要工作区域,分新生代(Eden、Survivor)和老年代
- 可能出现OutOfMemoryError
-
方法区(Method Area)
- 线程共享,存储类信息、常量、静态变量等
- JDK 8后由元空间(Metaspace)实现,使用本地内存
- 可能出现OutOfMemoryError
-
运行时常量池
- 方法区的一部分,存放编译期生成的字面量和符号引用
二、对象分配与逃逸分析
创建对象不一定分配在堆里,JVM会通过以下技术优化对象分配:
-
逃逸分析(Escape Analysis)
- 分析对象作用域是否逃逸出方法或线程
- 未逃逸对象可进行栈上分配或标量替换
-
栈上分配(Stack Allocation)
- 将未逃逸对象分配在栈上,随栈帧出栈自动销毁
- 减少GC压力
-
标量替换(Scalar Replacement)
- 将未逃逸对象拆解为基本类型变量
- 完全避免对象分配
-
TLAB(Thread Local Allocation Buffer)
- 每个线程在Eden区私有的分配区域
- 避免多线程竞争指针碰撞
- 默认大小为Eden区的1%
三、垃圾回收机制
根可达性算法
- 从GC Roots出发,标记所有可达对象
- GC Roots包括:
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI引用的对象
- 同步锁持有的对象
- JMXBean等系统对象
三色标记法
- 白色:未被访问的对象
- 灰色:已被访问但引用未扫描完的对象
- 黑色:已被访问且引用已扫描完的对象
- 作用:并发标记时追踪对象状态
- 好处:支持并发标记,减少STW时间
漏标问题解决方案
-
增量更新(Incremental Update)
- CMS采用,记录新增引用关系
- 写屏障(Write Barrier)实现
-
原始快照(Snapshot At The Beginning, SATB)
- G1采用,记录删除的引用关系
- 写屏障实现
浮动垃圾问题
- 产生原因:并发清理阶段用户线程产生的新垃圾
- 解决方案:
- 下次GC时清理
- CMS通过预留空间(-XX:CMSInitiatingOccupancyFraction)避免并发失败
四、垃圾收集器详解
CMS(Concurrent Mark Sweep)
设计目标与特点
- 目标:最小化老年代收集的停顿时间
- 类型:老年代收集器(与ParNew配合使用)
- 算法:标记-清除(Mark-Sweep)算法
- 工作模式:并发收集(与用户线程并行)
详细工作流程
-
初始标记(Initial Mark) - STW
- 暂停所有应用线程(STW)
- 标记GC Roots直接关联的对象
- 时间极短(通常1-10ms)
-
并发标记(Concurrent Mark)
- 与用户线程并发执行
- 从GC Roots开始遍历整个对象图
- 时间较长但不需要STW
-
重新标记(Remark) - STW
- 再次暂停所有应用线程
- 处理并发标记期间的对象变化
- 使用增量更新算法解决漏标问题
- 比初始标记时间长但远短于并发标记
-
并发清除(Concurrent Sweep)
- 与用户线程并发执行
- 清理未被标记的垃圾对象
- 使用空闲列表(free-list)管理内存
G1(Garbage First)
- 特点:
- 分Region的内存布局
- 可预测的停顿模型(-XX:MaxGCPauseMillis)
- 混合回收(Young GC + Mixed GC)
详细工作流程
-
Young GC
- STW操作
- 回收所有Eden和Survivor区
- 存活对象复制到新的Survivor或晋升到Old区
-
并发标记周期
- 初始标记(Initial Mark):STW,与Young GC同步进行
- 根区域扫描(Root Region Scan):扫描Survivor区引用
- 并发标记(Concurrent Mark):全堆对象标记
- 最终标记(Final Mark):STW,处理SATB缓冲区
- 清理(Cleanup):统计各Region存活对象
-
Mixed GC
- 回收部分Young和Old Region
- 基于停顿预测模型选择收益最高的Region
- 通过-XX:MaxGCPauseMillis控制目标停顿时间
-
四个阶段:
- 初始标记(STW)
- 并发标记
- 最终标记(STW)
- 筛选回收(STW)
-
优点:高吞吐兼顾低延迟,适合大堆
-
缺点:内存占用较高
五、类加载机制
双亲委派模型
-
加载流程:
- 子加载器先委托父加载器加载
- 父加载器无法完成时子加载器尝试加载
-
好处:
- 避免类重复加载
- 保证核心类安全(如java.lang.Object)
- 实现类的层次化隔离
破坏双亲委派
-
方式:
- SPI机制(如JDBC):使用线程上下文类加载器
- OSGi:网状类加载模型
- 热部署:自定义类加载器
-
Tomcat的实现:
- Web应用类优先自行加载
- 共享类库由Common类加载器加载
- 不同Web应用隔离(JSP类使用独立加载器)
六、JVM调优经验
-
内存调优:
- -Xms/-Xmx:堆初始/最大大小(建议设为相同值)
- -Xmn:新生代大小(建议占堆1/3到1/2)
- -XX:MetaspaceSize/-XX:MaxMetaspaceSize:元空间大小
-
GC调优:
- -XX:+UseG1GC:启用G1收集器
- -XX:MaxGCPauseMillis=200:目标停顿时间
- -XX:InitiatingHeapOccupancyPercent=45:G1触发并发周期阈值
-
监控工具:
- jstat:GC统计
- jmap:堆内存分析
- jstack:线程分析
- VisualVM/JProfiler:图形化分析
-
常见问题处理:
- OOM:分析堆/栈/元空间dump
- CPU高:定位热点线程/方法
- 长时间GC:调整收集器或内存比例
相关文章:

JVM 核心概念深度解析
最近正在复习Java八股,所以会将一些热门的八股问题,结合ai与自身理解写成博客便于记忆 一、JVM内存结构/运行时数据区 JVM运行时数据区主要分为以下几个部分: 程序计数器(PC Register) 线程私有,记录当前线程执行的字节码行号唯…...

api将token设置为环境变量
右上角 可以新增或者是修改当前的环境 环境变量增加一个token,云端值和本地值可以不用写 在返回token的接口里设置后执行操作,通常是登录的接口 右侧也有方法提示 //设置环境变量 apt.environment.set("token", response.json.data.token); 在需要传t…...

SIFT算法详细原理与应用
SIFT算法详细原理与应用 1 SIFT算法由来 1.1 什么是 SIFT? SIFT,全称为 Scale-Invariant Feature Transform(尺度不变特征变换),是一种用于图像特征检测和描述的经典算法。它通过提取图像中的局部关键点,…...

AlphaDrive:通过强化学习和推理释放自动驾驶中 VLM 的力量
AlphaDrive: Unleashing the Power of VLMs in Autonomous Driving via Reinforcement Learning and Reasoning 25年3月来自华中科技大学和地平线的论文 OpenAI 的 o1 和 DeepSeek R1 在数学和科学等复杂领域达到甚至超越了人类专家水平,其中强化学习(R…...

【八股消消乐】如何解决SQL线上死锁事故
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点ÿ…...

如何使用 HTML、CSS 和 JavaScript 随机更改图片颜色
原文:如何使用 HTML、CSS 和 JavaScript 随机更改图片颜色 | w3cschool笔记 (请勿标记为付费!!!!) 在网页开发中,为图片添加动态效果可以显著提升用户体验。今天,我将向…...
html如何在一张图片上的某一个区域做到点击事件
在HTML中,可以通过<map>和<area>标签来实现对图片的某个区域添加点击事件。这种方法通常用于创建图像地图(Image Map),允许用户点击图片的不同区域触发不同的事件。 以下是实现步骤和代码示例: 1. 准备图…...
Java数据校验:确保数据完整性和正确性
在软件开发中,数据校验是确保应用程序数据完整性和正确性的关键步骤。Java 提供了多种方式来实现数据校验,从简单的条件检查到复杂的框架支持。在这篇博客中,我们将探讨 Java 中数据校验的重要性、常用的校验注解以及如何整合校验框架来提高代…...
Java-IO流之序列化与反序列化详解
Java-IO流之序列化与反序列化详解 一、序列化与反序列化概述1.1 基本概念1.2 核心接口与类1.3 应用场景 二、Java序列化的基本实现2.1 实现Serializable接口2.2 使用ObjectOutputStream进行序列化2.3 使用ObjectInputStream进行反序列化 三、序列化的高级特性3.1 serialVersion…...
机器学习14-迁移学习
迁移学习学习笔记 一、迁移学习概述 迁移学习是机器学习中的一个重要领域,它旨在解决当目标任务的训练数据有限时,如何利用与目标任务相关但不完全相同的源任务数据来提高学习性能的问题。在现实世界中,获取大量高质量的标注数据往往成本高…...

CAN通信收发测试(USB2CAN模块测试实验)
1.搭建测试环境 电脑:安装 USB 驱动,安装原厂调试工具,安装cangaroo(参考安装包的入门教程即可) USB驱动路径:~\CAN分析仪资料20230701_Linux\硬件驱动程序 原厂调试工具路径:~\CAN分析仪资料2…...
小白初学SpringBoot记录
1.对于通过json返回用户信息时,需要忽略password字段操作: 1.1 pom配置jackson细节: <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>…...

OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤
一、靶机介绍 靶机地址:https://www.vulnhub.com/entry/bsides-vancouver-2018-workshop%2C231/ 靶机难度:中级(CTF) 靶机发布日期:2018年3月21日 靶机描述: Boot2root挑战旨在创建一个安全的环境&…...

PDF转Markdown/JSON软件MinerU最新1.3.12版整合包下载
MinerU发布至今我已经更新多版整合包了,5天前MinerU发布了第一个正式版1.0.1,并且看到在18小时之前有更新模型文件,我就做了个最新版的一键启动整合包。 2025年02月21日更新v1.1.0版整合包 2025年02月27日更新v1.2.0版整合包 2025-06-05 更…...
Android第十三次面试总结基础
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

【深入学习Linux】System V共享内存
目录 前言 一、共享内存是什么? 共享内存实现原理 共享内存细节理解 二、接口认识 1.shmget函数——申请共享内存 2.ftok函数——生成key值 再次理解ftok和shmget 1)key与shmid的区别与联系 2)再理解key 3)通过指令查看/释放系统中…...

编程基础:执行流
能帮到你的话,就给个赞吧 😘 文章目录 执行流同步:顺序执行,只有一个执行流异步:新开后台(次)执行流,后台执行流要确保不能影响主执行流。共有两个执行流。 阻塞:任务阻塞执行流,导致…...

理解非结构化文档:将 Reducto 解析与 Elasticsearch 结合使用
作者:来自 Elastic Adel Wu 演示如何将 Reducto 的文档处理与 Elasticsearch 集成以实现语义搜索。 Elasticsearch 与业界领先的生成式 AI 工具和提供商有原生集成。欢迎观看我们的网络研讨会,了解如何超越 RAG 基础,或使用 Elastic 向量数据…...
算法训练第十天
232. 用栈实现队列 代码: class MyQueue(object):def __init__(self):self.arr1 []self.arr2 []def push(self, x):""":type x: int:rtype: None"""self.arr1.append(x)def pop(self):""":rtype: int""…...
2种官方方法关闭Windows防火墙
2种官方方法关闭Windows防火墙 引言一、防火墙:你电脑的"智能安检员"二、这些场景,可能需要"临时撤防"三、极速关闭方案方法一:通过系统设置(Win10/11专属通道)方法二:通过传统控制面板(全系统通用:Win7-11全系)四、 必读安全警告(关闭前请三思!…...

[面试精选] 0094. 二叉树的中序遍历
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 94. 二叉树的中序遍历 - 力扣(LeetCode) 2. 题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 3. 题目示例 示例 1 : 输入&…...
股指期货期权交易规则是什么?
本文主要介绍股指期货期权交易规则是什么?股指期货期权是以股指期货合约为标的物的期权交易,其规则结合了期货与期权的特点。 股指期货期权交易规则是什么? 一、基础交易规则 交易时间 交易日9:30-11:30,13:00-15:00࿰…...

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]
学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1] 学习机器学习,需要学习如何预处理原始数据,这里用到pandas,将原始数据转换为张量格式的数据。 1、安装pandas pip install pandas 2、写入和读取数据 >>创建一个人工…...

2025年6月6日第一轮
2025年6月6日 The rapid in Chiese industdy is developnig e,and it is From be in a enjoy a deep is developing The drone industry in China is developing The drone industy in china develops rapidly and is in a leading position in in the world. The dro…...
记一次运行spark报错
提交spark任务运次报错 06/03 18:27:50 INFO Client: Setting up container launch context for our AM 25/06/03 18:27:50 INFO Client: Setting up the launch environment for our AM container 25/06/03 18:27:50 INFO Client: Preparing resources for our AM container …...

12-Oracle 23ai Vector 使用ONNX模型生成向量嵌入
一、Oracle 23ai Vector Embeddings 核心概念 向量嵌入(Vector Embeddings) -- 将非结构化数据(文本/图像)转换为数值向量 - - 捕获数据的语义含义而非原始内容 - 示例:"数据库" → [0.24, -0.78, 0.5…...
2. 库的操作
2.1 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name # 字符集: 存储编码 [DEFAULT] COLLATE collation_name # 校验集: 比较/选择/读…...

pytorch 与 张量的处理
系列文章目录 文章目录 系列文章目录一、Tensor 的裁剪二、Tensor 的索引与数据筛选torch.wheretorch.indicestorch.gathertorch.masked_selecttorch.taketorch.nonzero(省略) 三、Tensor 的组合与拼接torch.cattorch.stack 四、Tensor的切片chunksplit …...

layer norm和 rms norm 对比
Layer norm # Layer Norm 公式 mean x.mean(dim-1, keepdimTrue) var x.var(dim-1, keepdimTrue) output (x - mean) / sqrt(var eps) * gamma beta特点: 减去均值(去中心化)除以标准差(标准化)包含可学习参数 …...

Java高级 | 【实验六】Springboot文件上传和下载
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...