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 + 类加载 + 调优


相关推荐
狼爷6 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
祎雪双十Gy10 小时前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
小锋java123410 小时前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java
考虑考虑13 小时前
Java实现hmacsha1加密算法
java·后端·java ee
掉鱼的猫14 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
plainGeekDev14 小时前
广播接收器 → Flow + Lifecycle
android·java·kotlin
plainGeekDev14 小时前
EventBus → SharedFlow
android·java·kotlin
带刺的坐椅14 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon
用户37215742613514 小时前
Java 将一个 PPT 文档拆分为多个文件
java
人活一口气1 天前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc