全网视频合集网站建设广州前端培训机构
全网视频合集网站建设,广州前端培训机构,下载京东网上购物并安装,电子商务好找工作吗前言作为 Java 开发者#xff0c;理解 JVM#xff08;Java 虚拟机#xff09;是进阶的必经之路。无论是面试中高频出现的 JVM 内存模型、类加载机制#xff0c;还是工作中排查 OOM、StackOverFlowError 等问题#xff0c;都离不开对 JVM 核心原理的掌握。本文将从基础概念…前言作为 Java 开发者理解 JVMJava 虚拟机是进阶的必经之路。无论是面试中高频出现的 JVM 内存模型、类加载机制还是工作中排查 OOM、StackOverFlowError 等问题都离不开对 JVM 核心原理的掌握。本文将从基础概念入手系统梳理 JVM 的核心知识点涵盖 JDK/JRE/JVM 的关系、JVM 组成结构、类加载机制、内存模型、常见异常及参数配置帮助你构建完整的 JVM 知识体系。一、JDK、JRE、JVM 的关系核心认知首先要明确三者的包含关系JDK JRE JVM这是理解 Java 运行机制的基础。1. JVMJava 虚拟机JVM 是 Java 实现 “一次编译到处运行” 的核心是 Java 代码的运行时环境。核心功能负责内存管理、垃圾回收、多线程支持同时包含类加载器、运行时数据区、执行引擎等核心组件。经典实现HotspotOracle JDK 默认的 JVM 实现。2. JREJava 运行环境JRE 是运行 Java 程序的最小环境面向 Java 程序的使用者而非开发者。组成包含 JVM、核心类库、扩展类库以及运行 Java 程序所需的基础工具/bin 目录下。作用只要安装了 JRE就能运行编译后的 Java 字节码文件.class。3. JDKJava 开发工具包JDK 是 Java 开发的完整工具包面向 Java 开发者。组成包含 JRE、开发工具/bin/*.exe如 javac、java、javap 等、源码和官方文档。作用提供编译、运行、调试 Java 程序的全套能力是开发 Java 项目的必备环境。二、JVM 的核心组成部分JVM 的运行机制依赖四大核心组件各组件分工明确、协同工作类加载器负责将.class 文件加载到 JVM 内存中是连接 Java 代码和 JVM 的第一道桥梁。运行时数据区JVM 的内存核心分为栈、堆、方法区等区域用于存储程序运行时的所有数据。执行引擎执行加载后的字节码指令是 JVM 的 “CPU”支持解释执行和即时编译JIT。本地接口JNI实现 Java 与 C/C 等本地代码的交互扩展 Java 的底层能力。三、类加载器与双亲委派模型1. 类加载器的分类所有类加载器都继承自ClassLoader父类核心是 ClassLoaders 的内部类按职责分为四类类加载器实现语言加载路径核心作用启动类加载器BootstrapCjdk/jre/lib/*.jar如 rt.jar、jdk/jmods/加载 JVM 核心类库扩展类加载器Ext/PlatformJavajdk/jre/ext/lib/*.jar、jdk/jmods/加载扩展类库如 MD5 工具类应用类加载器App / 系统Javaclasspath、target/classes加载开发者编写的业务类自定义类加载器Java自定义路径满足特殊加载需求如热部署注意类加载器之间是层级关联关系而非继承关系。2. 双亲委派模型核心机制1核心目的保证类的唯一性JVM 中同一个类只会被加载一次避免字节码重复加载懒加载特性。保障安全性防止核心类如 java.lang.String被恶意篡改核心类只能由启动类加载器加载字节码开头的 CA FE BA BE 标识是基础校验。2工作流程自底向上检查当一个类加载器收到加载请求时先委托父类加载器加载层层向上直到启动类加载器。自上而下回退加载如果父类加载器无法加载找不到类则回退到子类加载器直到当前加载器完成加载若所有加载器都无法加载抛出ClassNotFoundException。四、JVM 运行时数据区内存模型1. 栈线程私有无 GC栈是线程私有的内存区域默认大小 1MB可通过参数-Xss调整如-Xss256k。数据结构先进后出FILO核心单元是栈帧一个栈帧对应一个方法的执行。栈帧组成局部变量表存储 8 种基本类型、引用类型地址。操作数栈临时存储表达式计算的中间结果。方法返回地址记录方法正常返回 / 异常抛出的位置。动态链接将符号引用转换为直接引用指向方法区的类元数据。常见异常过度递归会导致栈内存溢出抛出StackOverFlowError。2. 堆线程共享核心 GC 区域堆是 JVM 最大的内存区域所有线程共享是垃圾回收GC的核心区域可通过以下参数配置-Xms初始堆内存默认物理内存的 1/64如-Xms512m。-Xmx最大堆内存默认物理内存的 1/4如-Xmx4g。-Xmn新生代大小如-Xmn1g。堆空间按生命周期分为两大区域1新生代占堆的 1/3高频 GC新生代用于存储新创建的对象触发的 GC 称为Minor GC/Young GC回收频率高、速度快。伊甸园Eden占新生代的 8/10新对象优先分配到这里。幸存者区Survivor占新生代的 2/10分为 From 区0 区和 To 区1 区始终有一个为空“谁空谁是 To 区”。2老年代占堆的 2/3低频 GC老年代存储生命周期长的对象触发的 GC 称为Major GC/Full GC回收频率低、速度慢。对象进入老年代的条件新生代对象年龄达到 15 岁默认值可通过参数调整。大对象超过伊甸园大小直接进入老年代。幸存者区空间不足时对象提前进入老年代。堆常见异常堆内存不足时抛出OutOfMemoryErrorOOM。3. 方法区线程共享方法区是 JVM 规范定义的内存区域存储类元数据、方法字节码、静态变量、字符串常量池。版本差异JDK8 之前称为 “永久代”属于堆的一部分有内存上限。JDK8 及以后替换为 “元空间”使用本地内存默认无上限可通过参数限制。五、JVM 常用参数与异常1. 核心参数参数作用示例-Xss设置栈内存大小-Xss256k-Xms设置堆初始内存-Xms600m-Xmx设置堆最大内存-Xmx600m-Xmn设置新生代大小-Xmn200m-XX:PrintGCDetails打印 GC 详细日志JDK8-XX:PrintGCDetails-Xlog:gc*JDK9 替代 PrintGCDetails-Xlog:gc*调试示例-Xms30m -Xmx30m -XX:PrintGCDetails限制堆内存为 30M打印 GC 日志。2. 常见异常JVM 异常继承自Throwable核心分类如下Throwable ├── Error错误无法通过代码处理 │ ├── StackOverFlowError栈溢出 │ ├── OutOfMemoryError堆/方法区溢出 ├── Exception异常可通过代码处理 ├── RuntimeException运行时异常非强制处理 │ ├── ClassNotFoundException类未找到 ├── 其他编译期异常强制处理try/catch或throws异常处理关键字try监控代码、catch捕获异常、finally必执行代码、throw抛出异常、throws声明异常。六、核心总结GC 回收规律新生代频繁回收Minor GC、老年代很少回收Major GC、方法区几乎不回收。内存核心认知栈线程私有无 GC堆是 GC 核心区域分新生代 / 老年代方法区存储类元数据JDK8 后为元空间。核心机制双亲委派模型保障类的唯一性和安全性是类加载的核心规则。JVM 是 Java 的核心基石掌握本文的知识点不仅能应对面试更能帮助你在实际开发中排查内存溢出、性能瓶颈等问题。建议结合实际案例如模拟 OOM、分析 GC 日志加深理解真正做到 “知其然知其所以然”。如果本文对你有帮助欢迎点赞、收藏、关注后续会持续更新 JVM 调优、GC 算法等进阶内容