版本:基于 Java 17 & Java 21 LTS
在 Java 开发中,了解代码是如何在虚拟机 (JVM) 上运行的,是区分初级开发者与高级专家的重要标准。本篇将深入 JVM 内部,探讨内存模型 (JMM) 与现代垃圾回收 (GC) 机制。
1. JVM 内存区域划分
JVM 将内存分为几个主要区域,每个区域都有其特定的职责:
堆 (Heap):所有线程共享,存放所有的对象实例。这是 GC 主要工作的区域。
栈 (Stack):线程私有,存放局部变量、方法出口等。
方法区 (Method Area):存放类信息、常量、静态变量等。在 Java 8+ 中由 Metaspace (元空间) 实现,使用本地内存。
程序计数器 (PC Register):记录当前线程执行的字节码指令地址。
2. Java 内存模型 (JMM)
JMM 定义了 Java 虚拟机如何与计算机内存 (RAM) 协同工作。它解决了多线程环境下的可见性、原子性和有序性问题。
核心关键字:volatile
volatile 保证了变量的可见性(即一个线程修改了变量,其他线程能立即看到最新值)和禁止指令重排序。
public class VisibilityTest {
private volatile boolean flag = true; // 确保可见性
public void stop() { flag = false; }
public void run() {
while (flag) { /* 循环执行 */ }
}
}3. 垃圾回收 (GC) 机制
Java 的自动内存管理很大程度上依赖于垃圾回收。
判断对象是否已死
可达性分析算法 (Reachability Analysis):从
GC Roots开始搜索,不可达的对象即为垃圾。
现代垃圾回收器
G1 (Garbage First):Java 9+ 的默认回收器。适合大内存,能平衡吞吐量和延迟。
ZGC (Z Garbage Collector):Java 15+ 引入的高性能回收器。无论堆多大,停顿时间 (Pause Time) 都能控制在 1ms 以内。
4. 常用 JVM 调优参数
在启动现代 Java 应用时,你可能需要配置以下参数:
# 设置堆内存大小
java -Xms4g -Xmx4g -jar app.jar
# 指定垃圾回收器为 ZGC (Java 15+)
java -XX:+UseZGC -Xmx8g -jar app.jar
# 打印 GC 详细日志
java -Xlog:gc*:file=gc.log -jar app.jar5. 性能诊断工具
jps: 查看当前运行的 Java 进程。
jstat: 监控类加载、内存、GC 等统计信息。
jmap: 生成堆转储文件 (Heap Dump)。
VisualVM / JConsole: 图形化监控工具。
本章小结
第十一篇我们深入了解了:
JVM 的运行时数据区划分。
JMM 如何保证并发环境下的内存一致性。
现代 GC(如 G1 和 ZGC)的特点。
常用的调优参数与诊断工具。
下一篇预告:Java 设计模式实战 (单例、工厂、观察者、装饰器等)