目录开篇前置虚拟机基础概念与跨平台原理JVM 运行时数据区内存分区详解 2.1 线程私有区程序计数器、虚拟机栈、本地方法栈 2.2 线程共享区堆、方法区永久代 / 元空间 2.3 各区域内存溢出、栈溢出场景分析Class 类文件结构与类加载完整流程 3.1 Java 编译与 class 文件基础结构 3.2 类加载五大阶段加载、验证、准备、解析、初始化 3.3 四大类加载器层级划分 3.4 双亲委派模型原理、优势与破坏场景JVM 垃圾回收 GC 全体系 4.1 哪些内存区域需要垃圾回收 4.2 判断对象存活两种算法引用计数、可达性分析 4.3 Java 四大引用体系 4.4 四大经典垃圾回收算法 4.5 分代收集模型新生代 老年代运作流程 4.6 标记、清除、复制、整理底层细节 4.7 主流垃圾收集器特性对比补充虚拟机、C/C、Python 等语言底层差异总结JVM 核心知识串联复盘1. 开篇前置虚拟机基础概念与跨平台原理1.1 什么是 JVMJVM 全称 Java 虚拟机是一套进程级虚拟机和 VMware 这类系统虚拟机有本质区别系统虚拟机完整模拟 CPU 硬件指令虚拟一整套硬件设备占用资源极高JVM 进程虚拟机只专门解析 Java 字节码.class文件只模拟程序运行需要的运行环境轻量化运行。1.2 Java 跨平台底层原理开发者编写.java源码使用javac编译工具编译生成统一格式的.class字节码文件不同操作系统Windows、Linux、MacOS、Android提供对应平台实现的 JVM同一份 class 字节码交给不同系统的 JVM 解析执行实现一次编译到处运行。1.3 主流 JDK 与 JVM 说明JDK JRE 开发工具javac、jar 等JRE JVM Java 核心类库日常开发不需要单独安装 JVMJDK 内置 HotSpot 虚拟机。 市面主流虚拟机HotSpotOpenJDK/Oracle JDK 默认、IBM J9、阿里 TaobaoJVM全部遵循《Java 虚拟机规范》只是底层实现有差异。1.4 编译执行语言横向对比C/C直接编译为当前操作系统 CPU 识别的二进制机器码不能跨平台Windows 编译 exe 只能在 Windows 运行Python解释型语言自带 Python 虚拟机边解析边执行源码Java半编译半解释先编译字节码再由 JVM 解释 / 即时编译执行跨平台能力更强。1.5 JVM 核心三大学习模块市面上《深入理解 Java 虚拟机》一书是核心学习资料全书围绕三大核心板块JVM 运行时内存分区类加载机制垃圾回收 GC。2. JVM 运行时数据区内存分区详解每启动一个 Java 程序操作系统都会分配一块独立内存给 JVM这块内存划分为 5 大区域分为线程私有、线程共享两大类。2.1 线程私有区每个线程独立一份线程销毁内存自动释放2.1.1 程序计数器 Program Counter Register作用记录当前线程正在执行的字节码行号地址如果执行 native 本地方法计数器值为 null唯一特点JVM 规范里唯一不会发生 OOM 内存溢出的内存区域存在意义多线程切换时恢复线程上次执行位置保证多线程调度正常。2.1.2 Java 虚拟机栈 Java Stack描述 Java 方法执行的内存模型每调用一个方法就创建一个栈帧 Stack Frame方法执行完毕栈帧自动出栈销毁。 栈帧内部包含 4 部分局部变量表存放基础数据类型、对象引用地址编译期就确定占用内存大小操作数栈字节码运算临时存放数据先进后出动态链接指向运行时常量池的方法符号引用方法返回地址记录方法执行结束后跳转的位置。两种异常场景单个线程递归调用深度过大栈帧数量超出栈容量StackOverflowError栈溢出程序创建大量线程操作系统无法分配足够栈内存OutOfMemoryError栈内存溢出 控制参数-Xss设置单个线程栈内存大小。2.1.3 本地方法栈 Native Method Stack功能逻辑和 Java 虚拟机栈完全一致专门服务带native关键字的 C/C 本地方法HotSpot 虚拟机底层将虚拟机栈与本地方法栈合并实现。2.2 线程共享区全局所有线程共用生命周期随 JVM 进程2.2.1 堆 HeapJVM 中最大的一块内存所有对象实例、数组全部分配在堆中也是 GC 垃圾回收最核心的区域。参数控制-Xms堆初始内存、-Xmx堆最大内存分代划分新生代Eden、From Survivor、To Survivor、老年代 Old默认比例 Eden:S0:S18:1:1新生代老年代 1:2Eden 区新对象优先分配占新生代 80%双 Survivor 区Minor GC 存活对象复制交换避免内存碎片老年代长期存活对象、超大对象存放对象存活满 15 次 GC 晋升老年代溢出异常java.lang.OutOfMemoryError: Java heap space无限创建对象、内存泄漏、堆内存过小都会触发。2.2.2 方法区 Method Area规范定义的逻辑内存区域存储类元数据、静态变量、运行时常量池、JIT 编译代码HotSpot 分两代实现JDK7 及更早永久代 PermGen属于堆的一部分有固定内存上限字符串常量池放在永久代JDK8 及之后元空间 Metaspace直接使用操作系统本地内存不受 JVM 堆限制字符串常量池移入堆内存运行时常量池方法区子区域存放字面量、符号引用溢出异常java.lang.OutOfMemoryError: Metaspace动态生成大量类、加载过多第三方 jar 包会触发。2.3 各区域内存溢出实战场景堆 OOM循环无限 new 对象堆内存填满导出 dump 堆快照使用 MAT 工具排查内存泄漏栈溢出无终止递归调用栈帧持续创建触发 StackOverflowError元空间 OOM框架动态生成大量 Class、频繁热加载类元空间内存耗尽多线程栈 OOM批量创建上千线程每个线程独占栈内存操作系统分配内存失败。3. Class 类文件结构与类加载完整流程3.1 Java 编译与 class 文件基础结构Java 源码执行流程.java源码 → javac 编译 →.class字节码文件 → JVM 加载解析运行 class 文件是二进制文件固定结构包含魔数、版本号、常量池、访问标识、类索引、字段表、方法表、属性表其中常量池是核心存放类中所有字符串、符号引用。 静态变量准备阶段只会分配内存并赋予默认初始值静态代码块赋值在初始化阶段执行。3.2 类加载五大阶段加载、验证、准备、解析、初始化类完整生命周期加载 → 连接验证 准备 解析→ 初始化 → 使用 → 卸载加载 Loading通过类全限定名读取 class 二进制字节流在方法区生成类数据结构堆中创建对应 Class 对象作为访问类元信息的入口。验证 Verification四层校验文件格式校验、元数据校验、字节码校验、符号引用校验防止恶意破坏 JVM 的非法字节码。准备 Preparation为 static 静态变量分配内存赋默认零值int0引用 nullstatic int num100此处 num0100 在初始化阶段赋值。解析 Resolution把常量池中的符号引用转换为直接内存地址引用。初始化 Initialization执行类构造器clinit()执行静态代码块、静态变量显式赋值加载子类前必须先完成父类初始化。3.3 四大类加载器层级划分自上而下层级启动类加载器 Bootstrap ClassLoaderC 实现加载JAVA_HOME/lib下核心基础 jarrt.jar顶层加载器无父加载器扩展类加载器 ExtClassLoaderJava 实现加载 lib/ext 目录扩展工具包应用程序类加载器 AppClassLoader系统默认加载器加载项目 classpath 下业务代码、第三方依赖自定义类加载器继承 ClassLoader 重写加载逻辑用于类加密、热更新、自定义资源加载。3.4 双亲委派模型原理、优势与破坏场景3.4.1 双亲委派运行规则类加载器收到加载请求优先向上委托父加载器处理父加载器找不到对应类子加载器才自行加载。3.4.2 两大核心优势避免类重复加载顶层加载器加载后下层加载器无需重复加载同一个类安全防护防止开发者自定义java.lang.String、Object等核心类篡改 Java 底层 API。3.4.3 破坏双亲委派模型场景双亲委派默认是 “子委托父”存在底层 API 需要调用用户自定义实现的矛盾场景代表案例JDBC 驱动加载DriverManager核心类在 rt.jar由 Bootstrap 启动类加载器加载MySQL 驱动com.mysql.cj.jdbc.Driver在项目 jar 包由 App 应用类加载器加载顶层 Bootstrap 无法直接加载下层自定义驱动通过线程上下文类加载器反向委派打破双亲委派规则。4. JVM 垃圾回收 GC 全体系4.1 哪些内存区域需要垃圾回收线程私有区程序计数器、虚拟机栈、本地方法栈生命周期绑定线程线程销毁内存自动释放不需要 GC GC 只负责两块区域堆对象实例、方法区类、常量。4.2 判断对象存活两种算法4.2.1 引用计数算法每个对象维护计数器被引用 1引用失效 - 1计数器为 0 判定可回收。 致命缺陷无法解决对象循环引用主流 HotSpot 未采用。4.2.2 可达性分析算法HotSpot 默认以 GC Roots 根对象为起点遍历全部引用链没有任何引用链连通的对象判定为垃圾对象可回收。 可作为 GC Roots 的对象虚拟机栈局部变量表引用的对象方法区静态变量、常量引用对象Native 本地方法 JNI 引用对象。4.3 Java 四大引用体系引用强度从强到弱强引用Object obj new Object()只要引用存在GC 永远不会回收软引用 SoftReference内存即将溢出 OOM 时才回收适合缓存场景弱引用 WeakReference只要触发 GC必然回收临时缓存使用虚引用 PhantomReference无法获取对象本身仅用于接收对象回收通知。4.4 四大经典垃圾回收算法标记清除算法流程标记所有不可达垃圾对象 → 统一清除缺点执行效率差产生大量内存碎片大对象分配容易触发 GC。复制算法新生代主流将内存划分为两块存活对象复制到空闲分区清空原区域HotSpot 优化为 8:1:1 Eden 双 Survivor。优点无内存碎片缺点浪费一半内存空间对象存活率高时复制开销巨大。标记整理算法老年代主流标记存活对象 → 全部向内存一端移动压缩 → 清理边界外垃圾优点无内存碎片缺点移动对象开销大STW 停顿时间长。分代收集算法商用 JVM 统一方案根据对象生命周期划分区域适配不同算法新生代对象朝生夕灭使用复制算法老年代对象长期存活使用标记整理 / 标记清除。4.5 分代收集模型新生代 老年代运作流程新对象全部分配至 Eden 区Eden 填满触发 Minor GCMinor GC 后存活对象移入 Survivor 区S0/S1 来回交换对象存活达到晋升阈值默认 15 次 GC晋升到老年代老年代空间不足、元空间溢出、手动调用 System.gc () 等场景触发 Full GC全局停顿时间极长。4.6 标记、清除、复制、整理底层细节标记从 GC Roots 遍历给存活对象打上标记清除直接清空未标记的垃圾对象不整理内存复制只复制标记存活对象到备用内存整理标记完成后移动存活对象压缩内存消除碎片。4.7 主流垃圾收集器特性对比Serial/Serial Old单线程收集低内存嵌入式程序STW 停顿长ParNewSerial 多线程版本唯一可搭配 CMS 的新生代收集器Parallel Scavenge/Parallel Old吞吐量优先批量离线后台任务CMS并发低停顿收集器老年代并发标记清除缺陷CPU 占用高、内存碎片、浮动垃圾G1JDK9 默认堆划分为多个 Region 分块可控制 STW 停顿时间大内存服务首选整体标记整理、局部复制。5. 补充虚拟机、C/C、Python 等语言底层差异C/C无虚拟机直接编译机器码手动管理内存 malloc/free无 GC开发效率低、运行性能极强Python解释型虚拟机自带 GC 回收机制开发效率高运行性能弱于 JavaJavaJVM 屏蔽操作系统差异自动 GC 管理内存兼顾开发效率与运行性能Go 语言自带轻量级运行时三色标记并发 GC协程轻量化并发底层取舍总结手动内存管理性能更强、开发复杂虚拟机自动 GC 降低开发成本牺牲少量运行性能。6. 总结JVM 核心知识串联复盘本文完全按照笔记学习顺序梳理完整 JVM 知识整体分为四大核心板块虚拟机基础区分系统虚拟机 / 进程虚拟机理解 Java 跨平台底层逻辑运行时内存分区5 大内存区域功能、线程私有 / 共享区分、各类 OOM 异常场景类加载机制class 文件结构、加载五阶段、四层类加载器、双亲委派模型与破坏场景垃圾回收 GC对象存活判定、四大引用、四大回收算法、分代模型、主流收集器。以上内容覆盖后端面试、线上 GC 调优、内存泄漏故障排查全部核心考点是 Java 开发底层必备知识
Ubuntu安装桌面,mac电脑远程桌面 Ubuntu安装桌面# 1. 更新软件源(会花几秒) apt update && apt upgrade -y# 2. 安装 XFCE 轻量级桌面环境(比 Ubuntu 原版桌面省一半内存) apt install xfce4 xfce4-goodies -y# 3. 安装 xRDP 远程桌面服务(提供…
2026最新昭通本地漏水检测公司本地精选权威推荐:正规防水补漏公司优选口碑TOP5:卫生间/厨房/阳台/飘窗/地下室渗漏水维修师傅上门 - 即刻修防水 昭通房屋漏水维修指南:本地精选漏水检测公司权威推荐 一、昭通气候与房屋漏水痛点解析 昭通地处云南东北部,属亚热带季风气候,年降水量充沛且季节分布不均,雨季(6-8月)多暴雨,长期潮湿天气易导致房屋墙体返潮、…
AI Agent工程师实战指南:从RAG到LangGraph的技术架构解析 如果你正在关注2026年AI领域的技术趋势和就业机会,可能会发现一个明显的现象:传统的机器学习工程师岗位正在被更细分的AI应用开发角色取代。其中,AI Agent工程师已经成为当前最热门、薪资增长最快的技术岗位之一。为什么会出现这种变化&#…
C++字符串字符检测:从find到any_of的完整方案与性能优化 1. 项目概述:为什么字符串字符检测是C开发的基石在C的日常开发中,无论是处理用户输入、解析配置文件、清洗日志数据,还是实现一个简单的命令行工具,有一个操作出现的频率高到几乎无处不在:判断一个字符串里是否包含了某…
C++ vector内存管理:从深浅拷贝到自定义容器实现 1. 项目概述:从一次内存泄漏事故说起那天下午,线上服务突然告警,内存使用率在半小时内从40%飙升到95%,服务响应时间变得极慢。经过紧急排查,问题定位在一个看似简单的功能上:一个用于批量处理用户配置的C服…
自动化入门软件清单:从零到可交付的四层工具选型指南 1. 这不是“又一个自动化教程”,而是一份能让你少走三个月弯路的软件清单实录“autobot入门教程-软件清单”——看到这个标题,你大概率正站在自动化学习的起点:可能刚写完第一个Python爬虫,发现要登录、要绕验证码、要等页面加载&…
Android APK签名校验攻防:从Java Hook到V1签名替换实战 1. 项目概述:一场围绕“身份”的攻防拉锯战在移动安全领域,APK签名校验是开发者保护其应用不被篡改、确保代码来源可信的第一道,也是至关重要的一道防线。它就像是应用的“数字身份证”,系统在安装和运行时都会核验这张身份证的真…
从新手到专家:用RPFM开启你的《全面战争》模组创作之旅 从新手到专家:用RPFM开启你的《全面战争》模组创作之旅 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://gi…
C++智能指针深度解析:从RAII到unique_ptr与shared_ptr实战指南 1. 项目概述:为什么我们需要智能指针?在C的世界里,内存管理一直是个让人又爱又恨的话题。爱的是它给了我们无与伦比的掌控力,恨的是稍有不慎就会引发内存泄漏、悬垂指针或者双重释放这些令人头疼的Bug。我记得刚入行那会儿&#x…
AI推荐结果怎么优化:适合深圳少儿素质培训机构的GEO服务商哪家好?全程零代码SAAS操作 这两年,越来越多深圳地区的少儿素质培训机构开始关注 GEO。 原因很简单。过去家长找培训机构、找兴趣班、找素质教育课程,主要靠搜索引擎、短视频平台、社交平台种草和熟人推荐;现在越来越多深圳本地家长,已经开始直接在 AI 里提…
开源本地智能体 OpenClaw 2.7.9 保姆级部署手册,零代码操控电脑重复工作 📖前言 OpenClaw,在开发者社区中常被亲切地称为"小龙虾",是当前备受关注的开源 AI 智能体项目,其在 GitHub 平台上已累计获得超过 28 万星标。与常规的对话型 AI 工具不同,OpenClaw 能够理解自然语言指令&a…
广氟 PTFE 高速线缆膜 —— 高端线缆绝缘材料新选择 PTFE高速线缆膜的基本概念与特点 PTFE 高速线缆膜是以聚四氟乙烯树脂为原料,经膨化双向拉伸制成的多孔绝缘薄膜,作为高速高频通信线缆的核心介质材料,内部形成均匀连通的微孔结构,兼具极低介电常数与介电损耗,能有效降…
PlantUML 实战:5分钟将 UML 2.5 序列图转换为可执行代码草图 PlantUML 实战:5分钟将 UML 2.5 序列图转换为可执行代码草图 在软件开发过程中,清晰的系统设计往往比编码本身更为关键。传统拖拽式UML工具虽然直观,却常常成为效率杀手——频繁的鼠标操作打断设计思路,版本控制困难,…
【RT-DETR涨点改进】29 动态Batch推理:让RT-DETR在低延迟下吃满GPU算力 29 动态Batch推理:让RT-DETR在低延迟下吃满GPU算力 开篇故事 上个月帮一家安防厂商做项目优化,他们用RT-DETR做实时人流统计,部署在NVIDIA A10上。客户反馈说:“GPU利用率才30%,但延迟已经飙到40ms了,加人流量就丢帧。” 我远程一看,好家伙——生产环境里每个请求单独…
Postman 环境变量实战:3种动态设置方法与CI/CD集成避坑指南 Postman 环境变量高阶实战:动态管理与 CI/CD 深度集成在接口自动化测试领域,环境变量的灵活运用往往成为区分初级与高级测试工程师的关键能力。本文将深入探讨 Postman 环境变量的三种动态设置模式,并分享 Newman 在 CI/CD 流水线中的实战避坑…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…