主题
Java JVM
JVM(Java Virtual Machine,Java 虚拟机)是 Java 程序运行的核心,负责将 Java 字节码转换为机器码并执行。
JVM 架构
JVM 主要由以下几个部分组成:
- 类加载器(Class Loader)
- 运行时数据区(Runtime Data Areas)
- 执行引擎(Execution Engine)
- 本地方法接口(Native Method Interface)
类加载机制
类加载过程
- 加载(Loading):将类的字节码文件加载到内存
- 链接(Linking):
- 验证(Verification):验证字节码的正确性
- 准备(Preparation):为类变量分配内存并设置默认值
- 解析(Resolution):将符号引用转换为直接引用
- 初始化(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)
垃圾回收算法
- 标记-清除(Mark-Sweep)
- 标记-复制(Mark-Copy)
- 标记-整理(Mark-Compact)
- 分代收集(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:+UseG1GCJVM 调优
内存调优
bash
# 设置堆内存
-Xms512m -Xmx1024m
# 设置方法区(元空间)
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
# 设置栈大小
-Xss1mGC 调优
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 参数、选择合适的垃圾回收器、进行性能调优,可以提高应用的性能和稳定性。