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


相关推荐
张张123y6 分钟前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi
云老大-阿里云国际站代理商18 分钟前
华为云国际站渠道代理商:CSS查询很慢但CPU不高?磁盘I/O、JVM与分片问题怎么排查
css·jvm·华为云
小陈不好吃20 分钟前
Java 泛型与类型擦除:从 PECS 原则到 TypeToken 绕过
java·开发语言·windows·pecs 原则·typetoken绕过
鶴哥只手遮天25 分钟前
Spring Framework 7.0.9 深度剖析-03-IoC 容器核心:BeanFactory 与 BeanDefinition 体系
java·后端·开源
ydjs678899-bot31 分钟前
如何在Java中打印pdf静默打印和打印对话框选择
java·python·pdf
Shaoshing33 分钟前
存储引擎与架构
java·开发语言·架构
鶴哥只手遮天41 分钟前
Spring Framework 7.0.9 深度剖析-01-整体架构与设计哲学
java·后端·开源
const_qiu1 小时前
第 2.5 章 2.5.6:前端登录、Token 无感续签与路由守卫
java·前端·人工智能·状态模式
额额额对了1 小时前
Linux 驱动开发:基于 platform 总线 + misc 设备的 DS18B20 单总线温度驱动
linux·c语言·开发语言·驱动开发·嵌入式硬件
devilnumber1 小时前
Java 代理模式(简单理解回顾)
java·开发语言·代理模式