Skip to content

Java JVM

JVM(Java Virtual Machine,Java 虚拟机)是 Java 程序运行的核心,负责将 Java 字节码转换为机器码并执行。

JVM 架构

JVM 主要由以下几个部分组成:

  1. 类加载器(Class Loader)
  2. 运行时数据区(Runtime Data Areas)
  3. 执行引擎(Execution Engine)
  4. 本地方法接口(Native Method Interface)

类加载机制

类加载过程

  1. 加载(Loading):将类的字节码文件加载到内存
  2. 链接(Linking)
    • 验证(Verification):验证字节码的正确性
    • 准备(Preparation):为类变量分配内存并设置默认值
    • 解析(Resolution):将符号引用转换为直接引用
  3. 初始化(Initialization):执行类构造器 <clinit>() 方法

类加载器

  • Bootstrap ClassLoader:加载核心类库(rt.jar)
  • Extension ClassLoader:加载扩展类库
  • Application ClassLoader:加载应用程序类

运行时数据区

方法区(Method Area)

存储类的元数据、常量池、静态变量等。

堆(Heap)

存储对象实例,是垃圾回收的主要区域。

堆内存划分

  • 新生代(Young Generation)
    • Eden 区
    • Survivor 0 区
    • Survivor 1 区
  • 老年代(Old Generation)
java
// JVM 参数示例
// -Xms512m:初始堆大小
// -Xmx1024m:最大堆大小
// -XX:NewRatio=2:新生代与老年代比例

栈(Stack)

存储局部变量、方法参数、返回地址等。

  • 虚拟机栈:存储 Java 方法
  • 本地方法栈:存储 Native 方法

程序计数器(Program Counter)

记录当前线程执行的字节码指令地址。

垃圾回收(GC)

垃圾回收算法

  1. 标记-清除(Mark-Sweep)
  2. 标记-复制(Mark-Copy)
  3. 标记-整理(Mark-Compact)
  4. 分代收集(Generational Collection)

垃圾回收器

  • Serial GC:单线程,适合小应用
  • Parallel GC:多线程,适合吞吐量优先
  • CMS GC:并发标记清除,适合低延迟
  • G1 GC:分代收集,适合大堆内存
  • ZGC:低延迟,适合超大堆内存

GC 调优参数

bash
# 设置堆大小
-Xms2g -Xmx2g

# 设置新生代大小
-Xmn1g

# 设置 GC 日志
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log

# 选择 GC 收集器
-XX:+UseG1GC

JVM 调优

内存调优

bash
# 设置堆内存
-Xms512m -Xmx1024m

# 设置方法区(元空间)
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m

# 设置栈大小
-Xss1m

GC 调优

bash
# G1 GC 参数
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m

性能监控

使用 JVM 工具监控应用性能:

  • jps:查看 Java 进程
  • jstat:查看 JVM 统计信息
  • jmap:生成堆转储文件
  • jstack:查看线程堆栈
  • jconsole:图形化监控工具
  • VisualVM:可视化分析工具

常见问题

OutOfMemoryError

  • 堆内存溢出:增加堆内存或优化代码
  • 方法区溢出:增加方法区大小或减少类加载

StackOverflowError

栈溢出,通常由递归调用过深或方法调用链过长引起。

总结

理解 JVM 的工作原理对于 Java 开发至关重要。合理配置 JVM 参数、选择合适的垃圾回收器、进行性能调优,可以提高应用的性能和稳定性。