卡码笔记
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 基础与面向对象

  • 集合

  • 异常

  • 字符串

  • JVM

    • JVM的主要组成部分是什么?
      • 简要回答
      • 详细回答
      • 知识图解
      • 知识扩展
    • JVM的内存结构?
    • JVM常见参数?
    • 介绍一下类加载机制?
    • 介绍一下双亲委派机制?
    • 介绍一下强引用、软引用、弱引用和虚引用
    • 垃圾回收算法、机制
    • 常见的垃圾回收器有哪些?
  • 并发与多线程

  • JDK

  • Spring

  • 设计模式

# JVM组成部分

# 简要回答

  • JVM可以分为类加载器、运行时数据区、执行引擎、本地方法接口和本地方法库五个部分组成。
  • JVM通过类加载器将字节码(.class文件)加载到内存并生成class对象,运行时数据区作为JVM内存管理的区域中,使用特定的执行引擎将字节码翻译成底层系统指令,再交给CPU执行,这个过程需要调用其他语言的本地接口实现整个程序的功能。

# 详细回答

  1. 类加载器ClassLoader:
    • 启动类加载器(Bootstrap ClassLoader):是最顶层的加载类,JVM启动时加载核心类库(rt.jar,resources.jar,charset.jar等jar包和类,被参数-Xbootclasspath指定路径下的类)。
    • 扩展类加载器(Extension ClassLoader):是启动类加载器的子类,加载扩展目录(lib/ext)中的类库。
    • 应用程序类加载器(Application ClassLoader):是扩展类加载器的子类,加载当前应用类路径下的所有jar包和类。
  2. 运行时数据区Runtime Data Area:是Java虚拟机在执行Java程序过程中管理内存的一种方式,将内存划分为不同的区域,分为程序计数器,Java虚拟机栈,本地方法栈,Java堆和方法区。每个区域都有特定的用途和生命周期。
    • 程序计数器:记录当前线程所执行的字节码指令的地址。生命周期与线程相同。
    • Java虚拟机栈:方法执行时会创建一个栈帧,存储局部变量、操作数栈、动态链接等。每个线程有独立的Java虚拟机栈,生命周期与线程相同。
    • 本地方法栈:用于存储java中使用native标记的本地方法。是线程私有的,可以固定或动态扩展。
    • 堆:所有线程共享的内存区域,存放对象实例和数组。也是垃圾回收器执行垃圾回收的主要区域。
    • 方法区(元空间):所有线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量即时编译后的代码等数据。在启动JVM时创建,关闭JVM后释放。
  3. 执行引擎Execution Engine:
    • 解释器:将字节码指令翻译为对应平台的本地机器指令,由CPU执行,当一条指令执行完后,根据PC寄存器中记录的下一条指令执行解释操作。
    • JIT编译器:将源代码直接编译成与本地平台有关的机器码,并且进行各种层次的优化。由中间代码生成器、代码优化器、目标代码生成器、分析器组成。
    • 垃圾回收器:主要用于Java堆的管理,系统运行期间会产生的大量对象实例,GC回收无用的对象。
  4. 本地方法接口Native Method Interface:根据本地方法栈中有标记native的方法,生成一个对应的本地接口,启动执行引擎时,会根据本地方法接口去本地方法库中加载对应实现方法。
  5. 本地方法库Native Method Library:存储本地方法的实现方法。

# 知识图解

  1. JVM内部结构示意图 image
  2. 执行引擎内部结构示意图 image

# 知识扩展

  1. 扩展:
  • 类加载过程:可以分为三个主要阶段:加载,链接,初始化。
    1. 加载阶段:根据类的全限定名,获取字节码文件的二进制流。将字节流解析为方法区中的运行时数据结构,在堆内存生成Class对象,作为方法区数据的访问入口。
    2. 链接阶段:
      • 验证:确保字节码符合JVM规范,保证安全性。
      • 准备:为类的静态变量分配内存并设置默认值。
      • 解析:将常量池中的符号引用转换为直接引用。
    3. 初始化阶段:执行类的构造器方法,完成静态变量赋值和静态代码块的执行,如果类有父类,则先初始化父类。
  • JVM(虚拟机):能够屏蔽操作系统平台相关信息,使Java程序只需要生成在Java虚拟机上运行的目标代码,即解释自己的字节码并映射到本地的CPU指令集和OS的系统调用,实现“一次编译,到处运行”。主要工作有:
    1. 加载、验证、执行代码。
    2. 为各种应用程序提供运行时环境,还提供了内存区域、寄存器集。
    3. 提供垃圾收集堆,会报告致命错误,提供类文件格式。
  • rt.jar:代表RunTime,是Java基础类库,包含Java doc里所有的类的文件,如java.util.,java.io.,java.nio.,java.lang.,java.sql.*,java.math.*等常用内置库。
  1. 面试官可能追问:
  • Q1:解释器和JIT编译器的区别是什么?
    • 解释器会逐条执行字节码,没有编译开销,内存占用小,但是执行效率低。
    • JIT编译器会将热点代码编译成本地机器码,执行效率高,但是需要一定的编译时间,同时占用CodeCache。
  • Q2:为什么Java解释和编译都有?
    • Java同时采用解释和编译执行,这样可以平衡启动速度和执行效率。
    • 编译性:使用JIT(即时编译器)可以将频繁执行的代码(热点代码)提前编译为机器码并缓存,后续直接执行机器码。
    • 解释性:使用JVM中的解释器,将字节码逐行翻译为机器码并立即执行,不用提前编译,启动速度快且有跨平台性。JVM中一个方法调用计数器,当累计计数大于一定值后,就使用JIT进行编译生成机器码文件。
Last Updated: 3/10/2026, 6:08:48 PM

← String、StringBuffer和StringBuilder有什么区别? JVM的内存结构? →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪