手机h5免费模板网站青岛建设监理协会网站

张小明 2026/3/2 23:09:39
手机h5免费模板网站,青岛建设监理协会网站,网站开发电脑,网站建设与网页设计教程视频JVM原理解析#xff1a;内存模型、GC机制、类加载、执行引擎与调优实战 Java 虚拟机#xff08;JVM#xff09;是 Java 语言跨平台、自动内存管理、高性能的核心支撑。本文将从 JVM 整体架构、内存模型、类加载机制、执行引擎、垃圾回收#xff08;GC#xff09;、内存分配…JVM原理解析内存模型、GC机制、类加载、执行引擎与调优实战Java 虚拟机JVM是 Java 语言跨平台、自动内存管理、高性能的核心支撑。本文将从JVM 整体架构、内存模型、类加载机制、执行引擎、垃圾回收GC、内存分配、调优工具与参数七个维度全面拆解 JVM 的底层原理覆盖从字节码执行到内存优化的全链路知识帮你构建完整的 JVM 知识体系。一、JVM 整体架构程序运行的“骨架”JVM 的核心目标是加载并执行 Java 字节码文件其架构由三大核心模块和辅助模块组成各模块协同工作完成程序的编译与运行。JVM 整体架构 类加载子系统 运行时数据区 执行引擎 辅助工具垃圾回收器、本地方法接口类加载子系统负责将.class文件加载到内存并完成验证、准备、解析、初始化最终生成可被 JVM 使用的类对象。运行时数据区JVM 运行时的内存空间分为线程私有和线程共享区域是内存管理的核心。执行引擎负责执行字节码指令包括解释器、即时编译器JIT、垃圾回收器等核心组件。本地方法接口JNI连接 Java 代码与 C/C 等本地代码实现跨语言调用。本地方法库存放本地方法的具体实现如操作系统底层 API 封装。二、运行时数据区JVM 的“内存布局”运行时数据区是 JVM 管理内存的核心区域根据《Java 虚拟机规范Java SE 8》其分为线程私有区域和线程共享区域不同区域有明确的功能和生命周期。2.1 线程私有区域与线程同生共死线程私有区域的生命周期与所属线程一致线程创建时分配内存线程销毁时释放内存不存在多线程共享冲突问题。内存区域核心作用内部结构异常类型程序计数器1. 记录当前线程执行的字节码指令地址行号2. 支持线程切换后恢复执行线程上下文切换的核心3. 执行 Native 方法时计数器值为undefined无复杂结构仅存储指令地址唯一不会抛出 OOM 的区域虚拟机栈存储方法调用的栈帧Stack Frame每个方法从调用到执行完毕对应一个栈帧的入栈和出栈栈帧包含1. 局部变量表存储方法参数和局部变量2. 操作数栈执行字节码指令的临时数据栈3. 动态链接指向运行时常量池的方法引用4. 方法出口记录方法执行完毕后返回的地址1.StackOverflowError栈深度超过虚拟机允许的最大值如无限递归2.OutOfMemoryError栈容量动态扩展时无法申请到足够内存本地方法栈为 Native 方法如java.lang.Thread.start0()提供内存空间结构与虚拟机栈类似具体实现依赖底层操作系统同虚拟机栈2.2 线程共享区域随 JVM 启动/关闭而创建/销毁线程共享区域被所有线程共享是内存泄漏、OOM 异常的高发区也是 GC 的核心操作区域。内存区域核心作用版本差异异常类型堆Heap存储对象实例和数组是 JVM 最大的内存区域所有版本一致可通过-Xms初始堆大小、-Xmx最大堆大小参数调整OutOfMemoryError: Java heap space堆空间不足无法创建新对象方法区Method Area存储类信息类名、父类、接口、字段、方法、运行时常量池、静态变量、即时编译器编译后的代码缓存1. Java 7 及以前通过永久代PermGen实现受 JVM 内存限制2. Java 8 及以后移除永久代改用元空间Metaspace直接使用本地内存默认仅受物理内存限制1. Java 7OutOfMemoryError: PermGen space2. Java 8OutOfMemoryError: Metaspace运行时常量池方法区的一部分存储编译期生成的字面量如字符串常量和符号引用如类名、方法名运行时可动态添加常量如String.intern()1. Java 7从永久代移至堆2. Java 8属于元空间同方法区堆的细分为 GC 优化而生为了提高垃圾回收效率堆被进一步划分为新生代和老年代比例默认是1:2可通过-XX:NewRatio调整。新生代存储新创建的对象特点是对象存活率低、回收频繁采用标记-复制算法。细分区域Eden区占 80%、From Survivor区占 10%、To Survivor区占 10%比例可通过-XX:SurvivorRatio调整。老年代存储长期存活的对象特点是对象存活率高、回收频率低采用标记-清除算法或标记-整理算法。永久代/元空间注意永久代/元空间不属于堆是方法区的实现很多人容易混淆。三、类加载机制字节码的“加载与初始化”类加载子系统负责将磁盘上的.class文件加载到 JVM 内存并转换为java.lang.Class对象整个过程分为5 个阶段其中加载、验证、准备、初始化四个阶段的顺序是固定的解析阶段可在初始化之后执行支持动态绑定。3.1 类加载的 5 个核心阶段阶段核心操作关键细节加载Loading1. 通过类的全限定名获取.class文件的二进制字节流2. 将字节流转换为方法区的运行时数据结构3. 在堆中生成一个代表该类的Class对象作为方法区数据的访问入口加载的来源本地文件、网络如RMI、动态生成如动态代理、数据库等验证Verification确保.class文件的字节流符合 JVM 规范防止恶意字节码攻击验证内容文件格式验证如魔数0xCAFEBABE、元数据验证、字节码验证、符号引用验证准备Preparation为类的静态变量分配内存并设置默认初始值如int默认为 0boolean默认为false注意不会执行赋值语句如public static int a 1;准备阶段a的值是 0初始化阶段才会赋值为 1解析Resolution将常量池中的符号引用转换为直接引用如将类名转换为内存地址解析对象类或接口、字段、方法、方法类型等初始化Initialization执行类的静态代码块和静态变量赋值语句是类加载过程中唯一由程序员控制的阶段初始化触发条件1. 首次访问类的静态变量或静态方法2. 创建类的实例new关键字3. 反射调用类的方法Class.forName()4. 初始化子类时父类会先初始化5. JVM 启动时执行主类main方法所在类3.2 类加载器与双亲委派模型类加载器是实现“加载”阶段的核心组件JVM 提供了3 种内置类加载器同时支持自定义类加载器。3.2.1 内置类加载器类加载器加载范围父加载器启动类加载器Bootstrap ClassLoader加载JRE/lib目录下的核心类库如rt.jar由 C 实现不属于 Java 类无扩展类加载器Extension ClassLoader加载JRE/lib/ext目录下的扩展类库由 Java 实现启动类加载器应用程序类加载器Application ClassLoader加载用户类路径ClassPath下的类由 Java 实现扩展类加载器3.2.2 双亲委派模型双亲委派模型是类加载器的核心工作机制其核心规则是当一个类加载器收到加载请求时首先委托父加载器加载而非自己直接加载。父加载器无法加载该类时在自己的加载范围内找不到子加载器才会尝试自己加载。优点避免类的重复加载确保同一个类在 JVM 中只有一个Class对象。保证核心类库的安全防止用户自定义的类如java.lang.String替换 JVM 核心类。破坏场景为了实现热部署如 Tomcat 的WebappClassLoader。为了实现动态代理如JDK 动态代理。四、执行引擎字节码的“翻译与执行”执行引擎是 JVM 的“心脏”负责将运行时数据区中的字节码指令转换为机器指令执行核心组件包括解释器、即时编译器JIT和垃圾回收器。4.1 解释器原理采用逐行解释执行的方式将字节码指令翻译为机器指令执行一条翻译一条。优点启动速度快适合短时间运行的程序如脚本。缺点执行效率低因为每次执行都需要重新翻译。核心组件Bytecode InterpreterJVM 启动时默认使用解释器执行。4.2 即时编译器JIT为了解决解释器执行效率低的问题JVM 引入了即时编译器其核心目标是将热点代码编译为机器码提高执行效率。4.2.1 热点代码的判定JVM 通过热点计数器判定热点代码分为两种计数器方法调用计数器统计方法被调用的次数超过阈值默认 10000则标记为热点方法。回边计数器统计循环体执行的次数超过阈值则标记为热点循环。4.2.2 JIT 编译的优化策略JIT 编译器会对热点代码进行一系列优化常见优化手段包括方法内联将被调用的小方法的代码直接嵌入调用方减少方法调用开销。逃逸分析分析对象的作用域若对象未逃逸出方法则可进行栈上分配避免 GC、标量替换将对象拆分为基本类型、同步消除移除无用的锁。常量折叠将编译期可知的常量表达式直接计算结果如int a 1 2;优化为int a 3;。4.2.3 JIT 的两种编译器HotSpot 虚拟机提供了两种 JIT 编译器可通过参数调整C1 编译器轻量级编译器编译速度快优化程度较低适合客户端程序。C2 编译器重量级编译器编译速度慢优化程度高适合服务端程序。分层编译Java 7 默认开启结合 C1 和 C2 的优点先由 C1 编译再由 C2 进一步优化。4.3 本地方法接口JNI当字节码执行到native方法时执行引擎会通过 JNI 调用本地方法库中的 C/C 实现流程如下JVM 加载本地方法库如System.loadLibrary()。将 Java 类型转换为 C/C 类型如jint对应int。调用本地方法的实现函数。将 C/C 执行结果转换为 Java 类型并返回。五、垃圾回收GC机制内存的“自动清洁工”GC 是 JVM 最核心的特性之一其目标是自动识别并回收不再被引用的对象释放内存空间避免内存泄漏和 OOM 异常。GC 的核心流程是判断对象存活 → 选择回收算法 → 执行回收操作。5.1 判断对象是否存活的核心算法这是 GC 的前提只有确定对象“无用”才能进行回收。算法原理优点缺点JVM 应用引用计数法给每个对象添加一个引用计数器被引用时 1引用失效时 -1计数器为 0 的对象可回收实现简单判定效率高无法解决循环引用问题如 A 引用 BB 引用 A两者无外部引用但计数器不为 0未采用可达性分析算法以GC Roots为起点向下遍历对象引用链若对象不在任何引用链上则判定为可回收对象解决了循环引用问题实现复杂需要暂停用户线程STWHotSpot 虚拟机默认采用GC Roots 的组成GC Roots 是 JVM 中公认的“存活对象”包括以下 4 类虚拟机栈中局部变量表引用的对象。本地方法栈中 Native 方法引用的对象。方法区中类静态属性引用的对象。方法区中常量引用的对象。引用类型的扩展Java 提供了 4 种引用类型不同类型的对象有不同的回收策略引用类型回收时机应用场景强引用只有当强引用失效时对象才会被回收普通对象引用如Object obj new Object()软引用内存不足时对象会被回收缓存如SoftReference弱引用每次 GC 时对象都会被回收缓存如WeakReference、WeakHashMap虚引用随时可能被回收仅用于跟踪对象的回收状态管理直接内存如PhantomReference、Cleaner5.2 核心垃圾回收算法不同算法适用于不同的内存区域各有优劣JVM 采用分代收集算法结合多种基础算法。算法核心步骤优点缺点适用区域标记-清除算法Mark-Sweep1. 标记遍历所有对象标记可回收对象2. 清除遍历堆回收标记对象的内存实现简单无需移动对象1. 产生内存碎片大量不连续的内存块无法分配大对象2. 效率低标记和清除均需遍历全堆老年代标记-复制算法Mark-Copy1. 将内存分为两块大小相等的区域只用其中一块2. 标记存活对象复制到另一块区域3. 清空原区域的所有对象1. 无内存碎片2. 回收效率高内存利用率低仅 50%新生代优化只划分一块 Eden 区和两块小的 Survivor 区利用率提升至 90%标记-整理算法Mark-Compact1. 标记可回收对象2. 将存活对象向内存一端移动紧凑排列3. 清除边界外的所有对象1. 无内存碎片2. 内存利用率高效率低需移动对象涉及内存拷贝老年代分代收集算法结合新生代和老年代的特点1. 新生代对象存活率低用标记-复制算法2. 老年代对象存活率高用标记-清除/标记-整理算法兼顾效率和内存利用率实现复杂整个堆JVM 默认算法5.3 常用垃圾收集器垃圾收集器是回收算法的具体实现不同收集器适用于不同的应用场景HotSpot 虚拟机提供了多种收集器可通过参数指定。收集器适用区域核心特点垃圾回收停顿STW应用场景JVM 参数Serial GC新生代 老年代单线程回收采用标记-复制新生代 标记-整理老年代STW 时间长单核 CPU、小型应用如桌面程序-XX:UseSerialGCParNew GC新生代Serial GC 的多线程版本支持与 CMS 配合STW 时间比 Serial 短多核 CPU、追求低延迟的应用-XX:UseParNewGCParallel Scavenge GC新生代多线程回收目标是提高吞吐量运行用户代码时间/总时间STW 时间较短后台运算、批量处理任务如数据统计-XX:UseParallelGCParallel Old GC老年代Parallel Scavenge 的老年代版本采用标记-整理算法STW 时间较短与 Parallel Scavenge 配合适用于高吞吐量场景-XX:UseParallelOldGCCMS GCConcurrent Mark Sweep老年代基于标记-清除算法分 4 步执行1. 初始标记STW标记 GC Roots 直接引用的对象2. 并发标记无 STW遍历引用链3. 重新标记STW修正并发标记的偏差4. 并发清除无 STW回收对象STW 时间极短追求低延迟的 Web 应用如电商、金融-XX:UseConcMarkSweepGCG1 GCGarbage-First整个堆将堆划分为多个大小相等的 Region兼顾吞吐量和低延迟支持预测性 STW 时间STW 时间可预测大型应用、多核 CPU 环境如服务器-XX:UseG1GCZGC整个堆利用着色指针和读屏障技术几乎无停顿支持 TB 级内存停顿时间 10ms超大型应用、低延迟要求极高的场景如云计算-XX:UseZGCShenandoah GC整个堆与 ZGC 类似低停顿支持大内存停顿时间 10ms超大型应用-XX:UseShenandoahGC六、内存分配与回收策略对象的“安家落户”JVM 对对象的内存分配遵循**“优先新生代晋升老年代”的原则同时针对大对象、长期存活对象有特殊策略核心目标是减少 GC 次数提高程序性能**。6.1 核心分配策略对象优先在 Eden 区分配当创建新对象时JVM 优先将对象分配到新生代的 Eden 区。当 Eden 区空间不足时触发Minor GC新生代 GC将 Eden 和 From Survivor 中存活的对象复制到 To Survivor 区然后清空 Eden 和 From Survivor 区同时将对象的年龄计数器 1。大对象直接进入老年代大对象指需要大量连续内存空间的对象如长字符串、大数组。为了避免大对象在新生代中频繁复制浪费时间JVM 提供参数-XX:PretenureSizeThreshold超过该阈值的对象直接分配到老年代。长期存活的对象进入老年代每个对象都有一个年龄计数器每经历一次 Minor GC 且存活年龄 1。当对象年龄达到阈值默认 15会被晋升到老年代阈值可通过-XX:MaxTenuringThreshold调整。动态年龄判断新生代的 Survivor 区中相同年龄的所有对象大小总和超过 Survivor 区的一半时年龄大于等于该年龄的对象可直接晋升老年代无需等待阈值。老年代空间分配担保在触发 Minor GC 前JVM 会检查老年代最大可用连续空间是否大于新生代所有对象总大小。若大于则 Minor GC 安全执行若小于则检查-XX:HandlePromotionFailure参数是否开启开启尝试执行 Minor GC失败则触发Full GC整堆回收。关闭直接触发 Full GC。6.2 特殊分配策略栈上分配通过 JIT 的逃逸分析若对象未逃逸出方法即对象的作用域仅限于方法内部JVM 会将对象分配在虚拟机栈的局部变量表中而非堆中。优点对象随方法执行完毕而销毁无需 GC 参与减少内存开销。开启参数-XX:DoEscapeAnalysisJava 7 默认开启。七、JVM 调优JVM 调优的核心目标是减少 GC 次数、降低 STW 时间、提高程序吞吐量或降低延迟调优的前提是明确业务场景吞吐量优先或延迟优先。7.1 调优的核心步骤监控运行状态使用工具收集 JVM 运行数据如堆内存使用情况、GC 次数、STW 时间。分析瓶颈根据监控数据定位问题如频繁 Full GC、STW 时间过长、内存泄漏等。调整参数根据瓶颈调整 JVM 参数如堆大小、收集器类型、新生代比例等。验证效果重新运行程序监控调优后的指标迭代优化。7.2 常用调优工具工具核心功能适用场景jps列出正在运行的 JVM 进程查看进程 IDjstat监控 JVM 内存和 GC 状态实时查看堆内存使用、GC 次数、STW 时间jmap生成堆转储快照heap dump分析内存泄漏、大对象分布jhat分析堆转储快照查看对象数量、引用关系jstack生成线程快照thread dump排查死锁、线程阻塞VisualVM可视化监控工具整合 jps、jstat、jmap 等功能图形化分析 JVM 运行状态GCViewer分析 GC 日志可视化 GC 趋势、STW 时间分布7.3 核心调优参数参数分类核心参数作用示例堆内存参数-Xms设置初始堆大小建议与-Xmx相同避免堆动态扩展-Xms2g-Xmx设置最大堆大小-Xmx4g-XX:NewRatio设置新生代与老年代的比例默认 2新生代:老年代1:2-XX:NewRatio1-XX:SurvivorRatio设置 Eden 区与 Survivor 区的比例默认 8Eden:From:To8:1:1-XX:SurvivorRatio6收集器参数-XX:UseSerialGC使用 Serial 收集器--XX:UseParallelGC使用 Parallel Scavenge 收集器--XX:UseConcMarkSweepGC使用 CMS 收集器--XX:UseG1GC使用 G1 收集器-GC 日志参数-XX:PrintGCDetails打印详细 GC 日志--XX:PrintGCTimeStamps打印 GC 发生的时间戳--Xloggc:/path/to/gc.log将 GC 日志输出到指定文件-其他参数-XX:MaxTenuringThreshold设置对象晋升老年代的年龄阈值默认 15-XX:MaxTenuringThreshold10-XX:PretenureSizeThreshold设置大对象直接进入老年代的阈值-XX:PretenureSizeThreshold10485761MB-XX:DoEscapeAnalysis开启逃逸分析-八、核心总结JVM 的运行是一个多模块协同工作的复杂过程核心知识点可归纳为架构类加载子系统加载字节码运行时数据区管理内存执行引擎执行指令。内存线程私有区域程序计数器、虚拟机栈、本地方法栈和线程共享区域堆、方法区堆是 GC 的核心。类加载5 个阶段 双亲委派模型保证类的安全与唯一性。执行引擎解释器 JIT 编译器兼顾启动速度和执行效率逃逸分析实现栈上分配优化性能。GC可达性分析判断对象存活分代收集算法是核心策略不同收集器适配不同业务场景。调优监控 → 分析 → 调整 → 验证核心是根据业务场景选择合适的收集器和参数。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

三沙网站建设宁波网站设计哪家公司好

使用 Microsoft Deployment Toolkit 2008 进行系统部署全攻略 1. 安装和配置 MDT MDT 的安装相对简单,它以基本的 Windows Installer 安装程序形式提供。不过,它依赖于许多额外的技术和工具,这些都需要单独下载和安装。好在 Deployment Workbench 工具中提供了一个界面,方…

张小明 2026/1/17 11:00:05 网站建设

wordpress插件wordpress小工具长沙优化网站分析

Wan2.2-T2V-A14B在金融产品介绍视频批量创建中的效率提升 你有没有算过,一家银行每年要为多少款理财产品拍宣传视频?如果每条视频从策划到上线平均耗时3天、成本5万元——那一年光是“讲清楚自家产品”,就得烧掉几百万预算。更别提还要做不同…

张小明 2026/1/17 10:58:04 网站建设

广州网站建设 致茂不用代码做网站

1.pkill 进程名 会允许进程清理后退吗使用 pkill 进程名 时,进程是否允许清理后退取决于信号类型及进程的信号处理逻辑,具体分析如下:1. 默认信号为 SIGTERM(15),允许清理信号特性:pkill 进程名…

张小明 2026/1/17 10:56:03 网站建设

如何自学建网站目前国际电商平台有哪些

Kotaemon 支持 Thanos 长期存储吗?监控数据归档方案 在构建现代 AI 应用系统时,我们常常关注模型性能、知识检索准确率和对话流畅度,却容易忽视一个关键问题:当系统上线后,如何确保它的运行状态始终可见、可追溯、可回…

张小明 2026/1/17 10:54:02 网站建设

长沙百度网站建设网站建设书籍在线阅读

LobeChat 能否成为电商主播的“隐形军师”?用 AI 构建智能提词器 在杭州的一间小型直播间里,一位刚入行的主播正对着镜头介绍一款新上市的电动牙刷。她语速略快,眼神有些飘忽——不是因为紧张,而是她的视线始终落在面前那块不断滚…

张小明 2026/1/17 10:50:00 网站建设