java jvm知识点

下面给你一份 Java JVM 知识点全景总结(面试 + 实战级) ,

覆盖 内存结构 → 垃圾回收 → 类加载 → 调优 → 面试高频 ,适合 中高级 Java 面试。


一、JVM 是什么?

JVM(Java Virtual Machine)是 Java 程序的运行环境,负责加载字节码并执行。

✅ 跨平台

✅ 自动内存管理

✅ 安全沙箱


二、JVM 内存结构(必背 ⭐⭐⭐⭐⭐)

1️⃣ 运行时数据区

复制代码
JVM
├── 线程私有
│   ├── 程序计数器(PC)
│   ├── Java 虚拟机栈
│   └── 本地方法栈
└── 线程共享
    ├── 堆(Heap)
    ├── 方法区(Metaspace)
    └── 运行时常量池

2️⃣ 各区域作用

区域 作用 异常
程序计数器 记录执行位置 ❌
虚拟机栈 方法调用栈帧 StackOverflowError
本地方法栈 Native 方法 StackOverflowError
堆 对象实例 OutOfMemoryError
方法区 类信息、常量 OutOfMemoryError

三、Java 堆(GC 核心 ⭐⭐⭐⭐⭐)

1️⃣ 堆结构(分代)

复制代码
Heap
├── Young Generation
│   ├── Eden
│   ├── Survivor From
│   └── Survivor To
└── Old Generation

2️⃣ 对象分配流程

复制代码
new Object()
   ↓
Eden
   ↓
Minor GC
   ↓
Survivor
   ↓
年龄 ≥ 15
   ↓
Old

3️⃣ 为什么分代?

✅ 弱分代假说

✅ 大部分对象朝生夕死

✅ GC 效率更高


四、垃圾回收(GC ⭐⭐⭐⭐⭐)

1️⃣ 如何判断对象可回收?

✅ 引用计数法(不用)

  • 循环引用问题

✅ 可达性分析(JVM 使用)

复制代码
GC Roots
 ├── 栈中引用
 ├── 方法区静态变量
 ├── 常量
 └── JNI 引用

2️⃣ 垃圾回收算法

算法 说明
标记-清除 碎片多
标记-复制 无碎片
标记-整理 慢
分代收集 ✅ 主流

3️⃣ 常见 GC 器(重点)

GC 特点
Serial 单线程
Parallel Scavenge 吞吐量
CMS 低延迟
G1 ✅ 主流
ZGC 超低延迟

4️⃣ G1 GC(必问)

✅ 区域化(Region)

✅ 可预测停顿

✅ 替代 CMS


五、类加载机制(高频)

1️⃣ 类加载过程

复制代码
加载 → 验证 → 准备 → 解析 → 初始化

2️⃣ 类加载器

加载器 作用
Bootstrap rt.jar
Extension ext
Application classpath

3️⃣ 双亲委派模型

复制代码
自定义类加载器
      ↓
AppClassLoader
      ↓
ExtClassLoader
      ↓
BootstrapClassLoader

✅ 防止核心类被篡改


六、JVM 调优(实战)

1️⃣ 常用参数

bash 复制代码
-Xms2g
-Xmx2g
-Xmn512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200

2️⃣ OOM 排查

复制代码
jps
jstat -gc
jmap -heap
jmap -dump
MAT 分析

3️⃣ 常见 OOM

类型 原因
Java heap space 堆太小
Metaspace 类太多
GC overhead limit GC 过度
Direct buffer memory NIO

七、JVM 性能监控工具

工具 作用
jps 进程
jstat GC
jinfo 参数
jmap 堆
jstack 线程

八、JVM 面试高频 20 问(必刷)

✅ JVM 内存结构?

✅ 堆和栈区别?

堆是 JVM 中最大的内存区域,用于存储对象实例,是所有线程共享的,需要垃圾回收;

栈是线程私有的,用于存储方法调用的栈帧、局部变量和基本数据类型,随方法结束而释放,不需要 GC。

栈中存放的是对象的引用,真正的对象存储在堆中

✅ 对象创建过程?

✅ GC Roots 有哪些?

✅ Minor GC / Major GC?

✅ G1 工作原理?

✅ 双亲委派模型?

✅ 类加载过程?

✅ OOM 排查思路?


九、面试标准答案(背这段 ✅)

JVM 内存分为线程私有和线程共享两部分,堆是 GC 的主要区域。
通过可达性分析判断对象是否可回收,采用分代收集算法。
G1 是目前主流的垃圾收集器,通过 Region 化和可预测停顿提升性能。
类加载遵循双亲委派模型,防止核心类被篡改。


十、一句话总结(记住这句)

✅ JVM = 内存 + GC + 类加载 + 调优


相关推荐
starzy199011 小时前
深入理解Scala可变Map:动态构建场景下的性能与设计权衡
开发语言·scala
奶油话梅糖12 小时前
打开项目 0.9 秒、内存只有 IDEA 的 1/12:OpenIDEA 用 Rust 把 IntelliJ IDEA 重造了一遍
java·rust·github·intellij-idea
vipxieliang12 小时前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
Rain的Java大神之路12 小时前
公交App上“还有2站,约5分钟”怎么实现?90%的人答错这道大厂面试题:GPS漂移、ETA不准、10万QPS热点读全拆透(附完整代码)
java·后端·面试
golang学习记12 小时前
IDEA 2026.3 远程开发迎来重磅升级
java·ide·intellij-idea·远程开发
天天被压力12 小时前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python
敲代码的小小酥12 小时前
谈SpringMVC与Spring WebFlux的区别与适用场景
java·后端·spring
天天被压力13 小时前
【A股分钟级高频数据完全手册 #03】股票历史1分钟K线数据接口怎么用:Pro版批量拉取与本地缓存
java·人工智能·python
zhanghaha131413 小时前
C# 系列教程_7 判断语句(分支)保姆级精讲
开发语言·c#
apcipot_rain13 小时前
C++转Java日记(02)
java·开发语言·c++