JVM 深度解析(面试 + 实战版)

一、什么是 JVM

JVM(Java Virtual Machine,Java 虚拟机)是 Java 实现"一次编写,到处运行"的核心。

作用:

  1. 运行 Java 字节码(.class 文件)

  2. 屏蔽底层操作系统差异

  3. 自动内存管理(GC)

  4. 提供运行时环境(线程、类加载等)

👉 简单理解:

JVM 就是 Java 程序的"运行引擎"。


二、JVM 整体结构

JVM 主要分为三大部分:

  1. 类加载子系统

  2. 运行时数据区(内存结构)

  3. 执行引擎


三、类加载机制(重点)

1. 类加载流程

一个类从加载到使用,一共经历:

  1. 加载(Loading)

  2. 验证(Verification)

  3. 准备(Preparation)

  4. 解析(Resolution)

  5. 初始化(Initialization)


2. 双亲委派模型(面试高频)

类加载器层级:

  1. 启动类加载器(Bootstrap ClassLoader)

  2. 扩展类加载器(Extension ClassLoader)

  3. 应用类加载器(App ClassLoader)

👉 工作流程:

当一个类被加载时:

  1. 先让父类加载器加载

  2. 父类加载不了,才自己加载


3. 为什么要双亲委派?

核心作用:

  1. 防止重复加载

  2. 保证安全(核心类不被篡改)

👉 例子:

你不能自己写一个 java.lang.String 覆盖系统类。


四、JVM 内存结构(重点中的重点)

JVM 内存分为:

1. 线程私有

  1. 程序计数器

  2. 虚拟机栈

  3. 本地方法栈


2. 线程共享

  1. 堆(Heap)

  2. 方法区(JDK8 之后叫元空间 Metaspace)


五、详细内存区域解析

1. 堆(Heap)

👉 最重要区域,存放对象

结构:

  1. 新生代(Young Generation)

    • Eden区

    • Survivor区(S0、S1)

  2. 老年代(Old Generation)


2. 虚拟机栈

存储:

  1. 局部变量

  2. 方法调用

  3. 栈帧

👉 常见异常:

  • StackOverflowError(栈溢出)

3. 方法区(元空间)

存储:

  1. 类信息

  2. 常量池

  3. 静态变量

👉 JDK8 变化:

  • 永久代 → 元空间(使用本地内存)

六、对象创建过程(必考)

对象创建流程:

  1. 类加载检查

  2. 分配内存(指针碰撞 / 空闲列表)

  3. 初始化零值

  4. 设置对象头

  5. 执行构造方法


七、垃圾回收机制(GC)

1. 什么是 GC

GC(Garbage Collection)用于自动回收不再使用的对象。


2. 如何判断对象死亡?

两种方式:

  1. 引用计数法(已淘汰)

  2. 可达性分析(主流)

👉 核心思想:

从 GC Roots 出发,无法到达的对象 = 垃圾


3. 常见 GC Roots

  1. 栈中引用

  2. 静态变量

  3. 常量

  4. 本地方法引用


八、垃圾回收算法

1. 标记-清除

优点:

  • 简单

缺点:

  • 内存碎片

2. 复制算法

适用:

  • 新生代

特点:

  • Eden → Survivor

优点:

  • 无碎片

缺点:

  • 浪费空间

3. 标记-整理

适用:

  • 老年代

特点:

  • 标记 + 压缩

九、常见垃圾回收器

1. Serial(单线程)

适合:

  • 小型应用

2. ParNew

  • 多线程版 Serial

3. CMS(并发标记清除)

特点:

  1. 低停顿

  2. 并发执行

缺点:

  • 内存碎片

  • 已被淘汰


4. G1(主流)

特点:

  1. 分区回收(Region)

  2. 可预测停顿时间

  3. 适合大内存

👉 面试总结:

G1 = 当前主流垃圾回收器


十、JVM 调优(面试加分项)

1. 常见参数

复制代码
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:新生代大小
-XX:+UseG1GC:使用G1

2. 调优思路

  1. 先监控(jstat、jvisualvm)

  2. 分析 GC 次数和停顿时间

  3. 调整堆大小

  4. 选择合适 GC


十一、常见 JVM 问题

1. OOM(内存溢出)

常见类型:

  1. 堆内存溢出

  2. 栈溢出

  3. 元空间溢出


2. 排查思路

  1. dump 内存

  2. 分析工具(MAT)

  3. 找大对象


十二、面试高频总结(重点背)

  1. JVM 内存结构

  2. 双亲委派模型

  3. GC 算法区别

  4. G1 和 CMS 区别

  5. 对象创建过程

  6. OOM 排查


十三、一句话总结

👉 JVM 本质就是:

类加载 + 内存管理 + 垃圾回收 + 执行引擎

相关推荐
Accerlator10 小时前
2026 年 4 月 1 日电话面试
面试·职场和发展
周末也要写八哥12 小时前
多进程和多线程的特点和区别
java·开发语言·jvm
前端Hardy14 小时前
前端必看!LocalStorage这么用,再也不踩坑(多框架通用,直接复制)
前端·javascript·面试
前端Hardy14 小时前
前端必看!前端路由守卫这么写,再也不担心权限混乱(Vue/React通用)
前端·javascript·面试
凌波粒17 小时前
LeetCode--344.反转字符串(字符串/双指针法)
算法·leetcode·职场和发展
啊哦呃咦唔鱼17 小时前
LeetCode hot100-543 二叉树的直径
算法·leetcode·职场和发展
秋风不问归客17 小时前
Springboot面试全面整理
spring boot·后端·面试
小冷coding17 小时前
【面试】结合项目整理的场景面试题,覆盖 Java 基础、锁、多线程、数据库、分布式锁 / 事务、消息中间件等核心维度
java·数据库·面试
我叫黑大帅17 小时前
PHP中的官方操作数据库PDO
后端·面试·php
张元清18 小时前
React 鼠标追踪与交互效果实战
前端·javascript·面试