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