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 本质就是:

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

相关推荐
发现一只大呆瓜9 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
Patrick_Wilson11 小时前
知识沉淀的四层模型:从个人笔记到企业资产,让文档真正长出复利
面试·程序员·ai编程
橙序员小站12 小时前
人人都在鼓吹的OPC,我想给你泼盆冷水
面试·创业
小小编程路12 小时前
C++ 多线程与并发
java·jvm·c++
图像僧15 小时前
vs2019中的属性页使用说明
java·开发语言·jvm
凌波粒16 小时前
LeetCode--404.左叶子之和(二叉树)
算法·leetcode·职场和发展
青山师16 小时前
二叉树与BST深度解析:遍历算法与平衡策略
数据结构·算法·面试·二叉树·算法与数据结构·java面试·数据结构与算法分析
绝知此事16 小时前
【算法突围 03】核心算法思想:分治/递归/动态规划与 LeetCode 高频真题解析
算法·leetcode·面试·动态规划
Wanderer X16 小时前
【面试】HR
面试