服务器测评网
我们一直在努力

Java虚拟机知识有哪些核心原理需要掌握?

Java 虚拟机概述

Java 虚拟机(Java Virtual Machine,JVM)是 Java 技术的核心组件,它是一个抽象的虚拟计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现 Java 程序的跨平台运行,JVM 负责将 Java 字节码转换为特定机器平台的机器码,并管理程序的执行过程、内存分配和垃圾回收等关键任务,作为“一次编写,到处运行”(Write Once, Run Anywhere)理念的实现基础,JVM 屏蔽了不同操作系统和硬件的差异,为 Java 程序提供了统一的运行环境。

Java虚拟机知识有哪些核心原理需要掌握?

JVM 的内存结构

JVM 的内存结构是理解其工作机制的基础,主要分为线程私有区和线程共享区两大类。

线程私有区

  • 程序计数器(PC Register):一块较小的内存空间,可以看作是当前线程所执行的字节码行号指示器,在 Java 虚拟机规范中,唯一没有规定任何 OutOfMemoryError 情况的区域。
  • 虚拟机栈(JVM Stack):存储局部变量表、操作数栈、动态链接、方法出口等信息,每个方法在执行时会创建一个栈帧(Stack Frame),栈帧随着方法的调用而入栈,随着方法的结束而出栈,栈深度过大时会抛出 StackOverflowError,栈内存不足时则抛出 OutOfMemoryError
  • 本地方法栈(Native Method Stack):与虚拟机栈类似,但为虚拟机使用到的 native 方法(非 Java 语言实现的方法)服务,HotVM 虚拟机将虚拟机栈和本地方法栈合二为一。

线程共享区

  • 堆(Heap):Java 内存管理中最大的一块区域,所有线程共享,用于存储对象实例和数组,JVM 规定堆中必须实现自动内存管理(即垃圾回收),堆内存不足时会抛出 OutOfMemoryError
  • 方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据,HotVM 中的元空间(Metaspace)取代了永久代(PermGen),使用本地内存,避免了永久代的 OutOfMemoryError 问题。
  • 运行时常量池(Runtime Constant Pool):是方法区的一部分,用于存放编译期生成的字面量符号引用,也可在运行时将新的常量放入池中,如 Stringintern() 方法。

垃圾回收机制

垃圾回收(Garbage Collection,GC)是 JVM 自动管理内存的核心机制,主要针对堆和方法区中的无用对象进行回收,避免内存泄漏。

垃圾回收的判定算法

  • 引用计数法:为每个对象添加一个引用计数器,每当有一个地方引用它时,计数器加 1;引用失效时减 1,计数器为 0 时即判定为垃圾,但无法解决循环引用问题。
  • 可达性分析算法:通过一系列称为 “GC Roots” 的对象作为起始点,从这些节点开始向下搜索,所走过的路径称为 “引用链”,当一个对象到 GC Roots 没有任何引用链相连时,即判定为不可达(垃圾),Java 中使用该算法,GC Roots 包括虚拟机栈中引用的对象、方法区中类静态属性引用的对象等。

垃圾回收算法

  • 标记-清除算法:标记所有需要回收的对象,统一清除,缺点是内存碎片化严重,可能导致后续大对象无法分配。
  • 标记-复制算法:将内存分为大小相等的两块,每次只使用其中一块,当这块内存用完后,将存活对象复制到另一块,然后清空原内存块,实现简单、高效,无碎片,但内存空间折半。
  • 标记-整理算法:标记过程与 “标记-清除” 一致,但后续不是直接清除,而是将存活对象向内存空间一端移动,然后直接清理端边界以外的内存,结合了前两者的优点,但效率较低。

垃圾回收器

  • Serial GC:单线程收集器,进行垃圾回收时必须暂停所有用户线程(Stop-The-World),适用于客户端模式。
  • Parallel GC:Serial GC 的多线程版本,能充分利用多核 CPU,注重吞吐量,是 JDK 8 默认的垃圾回收器。
  • CMS(Concurrent Mark Sweep)GC:以获取最短回收停顿时间为目标,采用标记-清除算法,并发执行部分阶段,但会产生内存碎片,且可能出现 “Concurrent Mode Failure”。
  • G1(Garbage-First)GC:面向服务端设计的垃圾回收器,将堆划分为多个大小相等的独立区域,能预测停顿时间,避免内存碎片,是 JDK 9 后的默认垃圾回收器。

类加载机制

类的加载是指 Java 源文件(.java)经过编译后生成字节码文件(.class),再通过类加载器将字节码文件加载到内存中,并转换为 Class 对象的过程。

Java虚拟机知识有哪些核心原理需要掌握?

类加载的七个阶段

  1. 加载(Loading):通过类加载器读取 .class 文件,生成字节码流,并转换为方法区内的运行时数据结构,在内存中生成 Class 对象。
  2. 验证(Verification):确保 .class 文件的字节流中包含的信息符合当前虚拟机的要求,防止恶意代码执行。
  3. 准备(Preparation):为类变量(静态变量)分配内存,并设置零值(如 int 类型的变量初始化为 0,引用类型初始化为 null)。
  4. 解析(Resolution):将常量池内的符号引用替换为直接引用。
  5. 初始化(Initialization):执行类构造器 <clinit>() 方法,为类变量赋予正确的初始值(由程序员在代码中显式赋值)。
  6. 使用(Using):主动使用类,如创建对象、访问类变量等。
  7. 卸载(Unloading):类的 Class 对象不再被引用时,被 GC 回收。

双亲委派模型

类加载器通过双亲委派模型组织结构,避免类的重复加载和安全性问题,工作流程如下:当一个类加载器收到类加载请求时,首先委派给父类加载器,递归向上,直到顶层的启动类加载器(Bootstrap ClassLoader),若父类加载器无法完成加载,子类加载器才会尝试自己加载。

  • 启动类加载器:负责加载 JAVA_HOME/jre/lib 下的核心类库(如 rt.jar),由 C++ 实现,是 JVM 自带的类加载器。
  • 扩展类加载器:负责加载 JAVA_HOME/jre/lib/ext 下的扩展类库。
  • 应用程序类加载器:加载用户类路径(Classpath)下的类,是程序默认的类加载器。

JVM 的性能调优

JVM 性能调优的核心目标是优化内存分配、减少 GC 停顿时间、提高系统吞吐量,常见的调优手段包括:

  • 堆大小设置:通过 -Xms(初始堆大小)和 -Xmx(最大堆大小)参数调整堆内存,避免频繁扩容或内存不足。
  • 新生代与老年代比例:通过 -XX:NewRatio 调整新生代(Eden 区、From Survivor 区、To Survivor 区)与老年代的比例,减少对象过早进入老年代。
  • 垃圾回收器选择:根据应用场景选择合适的垃圾回收器,如对停顿敏感的系统选择 G1 或 ZGC(低延迟垃圾回收器)。
  • JVM 监控工具:使用 jps(查看进程)、jstat(监控内存和 GC)、jmap(生成堆转储文件)、jstack(生成线程快照)等工具分析 JVM 运行状态。

Java 虚拟机作为 Java 生态的基石,通过内存管理、垃圾回收、类加载等机制,为 Java 程序提供了高效、稳定、跨平台的运行环境,深入理解 JVM 的内存结构、工作原理和调优方法,不仅有助于解决开发中的内存泄漏、性能瓶颈等问题,更能编写出更高效、更健壮的 Java 程序,随着技术的不断发展,JVM 也在持续演进,如引入 GraalVM(支持多语言运行)等新技术,为开发者提供更强大的能力。

Java虚拟机知识有哪些核心原理需要掌握?

赞(0)
未经允许不得转载:好主机测评网 » Java虚拟机知识有哪些核心原理需要掌握?