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


相关推荐
Shadow(⊙o⊙)1 小时前
qt中自定义槽函数 内部继承逻辑、GUI+CLI协同1.0
开发语言·前端·c++·qt
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第55题】【JVM篇】第15题:JVM有哪些垃圾收集算法?
java·jvm·算法·面试
摇滚侠1 小时前
Java 基础面试题 真正的 offer 偏方 Java 基础 Java 高级
java·开发语言
蚰蜒螟1 小时前
深入剖析 OpenJDK 17 解释器中的安全点(Safepoint)进入与退出机制
java·开发语言·安全
山岚的运维笔记1 小时前
Bash 专业人员笔记 -- 第 11 章:`true`、`false` 和 `:` 命令
linux·运维·服务器·开发语言·笔记·学习·bash
代钦塔拉1 小时前
第一篇:字符编码全解:从ASCII/GBK/Unicode到UTF-8
开发语言·qt
Generalzy1 小时前
为什么 Go 的注释,能控制编译器?
java·python·golang
syagain_zsx1 小时前
Qt初识,快速上手
开发语言·qt
Wy_编程1 小时前
go语言面向对象和异常处理
开发语言·后端·golang