Dev Guide / Java开发技术guide / java
content/dev-guide/a-Java开发技术guide/02-java/4-jvm.md
- 内存区域
- Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域(运行时内存区域)。
- jdk1.7之前划分:线程私有(程序计数器、虚拟机栈、本地方法栈)、线程共享(堆-字符串常量池、方法区-运行时常量池)
- jdk1.8 之后划分:线程私有(程序计数器、虚拟机栈、本地方法栈)、线程共享(堆-字符串常量池)
- 本地内存:直接内存(非运行时数据区的一部分)、元空间-运行时常量池(jdk1.8之后),线程共享
- 栈:生命周期极短,跟随方法调用。适合放临时数据(局部变量、方法参数)。方法返回,栈帧弹出,内存瞬间回收,零 GC 开销。
- 堆:所有 new 出来的对象实体 和 数组、字符串常量池(生命周期长,跨方法、跨线程可见。适合放对象实例和成员变量。由 GC 统一管理)
- 方法区/元空间: 方法的字节码、静态变量
- 垃圾回收(共享区,主要是堆区)
- 判断对象是否存活:引用计数法、可达性分析算法(GC Roots)
- 垃圾回收算法:标记清除、标记整理、复制算法、分代收集算法
- 新生代收集器:Serial(单线程)、Parallel(Serial多线程版,配合CMS使用)、Parallel Scavenge。采用复制算法。
- 老年代收集器:Serial Old(标记整理算法,单线程)、Parallel Old(标记整理,多线程,关注吞吐量)、CMS(并发标记清除,jdk9废弃)
- 全堆收集器:G1(分区整理算法/分代收集)、ZGC(染色指针算法)
- 类加载机制
- 类加载器:Bootstrap ClassLoader(启动类加载器,加载 jdk 的核心类库)、Extension ClassLoader(扩展类加载器,加载 jdk 的扩展类库)、App ClassLoader(应用程序类加载器,加载应用程序类库)
- 类加载过程:加载、验证、准备、解析、初始化、使用、卸载
- 双亲委派模型:当一个类加载器收到类加载请求时,它会先递归地调用父类加载器的loadClass()方法,直到父类加载器为null,即Bootstrap ClassLoader。如果父类加载器能够加载该类,则返回该类的Class对象;否则,子类加载器会尝试自己加载该类。
- 字节码和执行引擎
- Class文件结构:魔数、版本号、常量池、访问标志、字段表/方法表、属性表
- 执行引擎:解释器(逐行解释执行,启动快)、JIT编译器(将热点代码编译为本地机器码)、垃圾回收器(内存管理)
- JIT编译:分层编译(C1编译器-快速编译,简单优化、C2编译器-慢速编译,深度优化、热点探测)
- JIT优化技术:方法内联(消除方法的调用开销)、逃逸分析、锁优化
- 性能调优和故障排查
- 常见OOM异常
- 调优工具
- 常用JVM参数
- 线上问题排查步骤:监控(GC 频率、停顿时间、堆使用率)、分析(常用 jstack 查线程,jmap 查内存)、定位、调整、验证