理解JVM才能写出高效的Java程序,掌握调优才能让程序跑得更快。
目录
- [1. JVM概述](#1. JVM概述)
- [2. JVM内存模型](#2. JVM内存模型)
- [3. 垃圾回收(GC)](#3. 垃圾回收(GC))
- [4. JVM调优参数](#4. JVM调优参数)
- [5. 性能监控工具](#5. 性能监控工具)
- [6. 性能优化技巧](#6. 性能优化技巧)
- [7. 总结](#7. 总结)
- 参考资源
1. JVM概述
1.1 什么是JVM?
JVM是Java虚拟机,是运行Java程序的平台。Java程序编译成字节码后,由JVM解释执行。
Java程序执行流程:
源代码(.java) → 编译器(javac) → 字节码(.class) → JVM → 机器码 → 执行
2. JVM内存模型
2.1 运行时数据区
java
public class MemoryDemo {
// 方法区:存储类信息、常量、静态变量
static int classVariable = 10;
static final String CONSTANT = "常量";
// 堆:存储对象实例
private int instanceVariable;
public void method() {
// 栈:存储局部变量、方法调用信息
int localVar = 20;
// 创建的对象也存储在堆中
Object obj = new Object();
}
public static void main(String[] args) {
MemoryDemo demo = new MemoryDemo();
demo.method();
}
}
2.2 堆内存结构
堆内存(Heap)
├── 新生代(Young Generation)
│ ├── 伊甸园区(Eden):新对象分配在这里
│ ├── 幸存者0区(Survivor 0)
│ └── 幸存者1区(Survivor 1)
└── 老年代(Old Generation)
└── 长期存活的对象
java
public class HeapDemo {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
long maxMemory = runtime.maxMemory(); // 最大堆内存
long totalMemory = runtime.totalMemory(); // 当前堆内存
long freeMemory = runtime.freeMemory(); // 空闲堆内存
System.out.println("最大堆内存:" + maxMemory / 1024 / 1024 + "MB");
System.out.println("当前堆内存:" + totalMemory / 1024 / 1024 + "MB");
System.out.println("空闲堆内存:" + freeMemory / 1024 / 1024 + "MB");
}
}
3. 垃圾回收(GC)
3.1 什么是垃圾回收?
垃圾回收(Garbage Collection)是JVM自动管理内存的机制,会自动回收不再使用的对象。
java
public class GCDemo {
public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
// obj1不再被引用,成为垃圾
obj1 = null;
// 建议JVM进行垃圾回收(不保证立即执行)
System.gc();
System.out.println("垃圾回收完成");
}
}
3.2 垃圾收集器
常见垃圾收集器:
- Serial:单线程,适合客户端
- Parallel:多线程,适合服务端
- CMS:并发标记清除,低停顿
- G1:分区收集,JDK 9+默认
- ZGC:超低停顿,JDK 11+
4. JVM调优参数
4.1 内存相关参数
bash
# 设置堆内存
java -Xms512m -Xmx1024m MyApp
# 设置新生代大小
java -Xms1024m -Xmx1024m -Xmn256m MyApp
4.2 GC相关参数
bash
# 使用G1收集器
java -XX:+UseG1GC MyApp
# 设置GC日志
java -Xloggc:gc.log -XX:+PrintGCDetails MyApp
5. 性能监控工具
bash
# jps:查看Java进程
jps -l
# jstat:查看GC统计信息
jstat -gc <pid> 1000 10
# jmap:查看堆内存使用情况
jmap -heap <pid>
# jstack:查看线程堆栈
jstack <pid>
6. 性能优化技巧
6.1 字符串优化
java
public class StringOptimization {
public static void main(String[] args) {
// 不好的写法:字符串拼接
String bad = "";
for (int i = 0; i < 10000; i++) {
bad += "a"; // 每次都创建新字符串
}
// 好的写法:使用StringBuilder
StringBuilder good = new StringBuilder();
for (int i = 0; i < 10000; i++) {
good.append("a");
}
String result = good.toString();
System.out.println("字符串长度:" + result.length());
}
}
6.2 集合优化
java
import java.util.*;
public class CollectionOptimization {
public static void main(String[] args) {
// 预分配集合大小
List<String> list = new ArrayList<>(10000);
for (int i = 0; i < 10000; i++) {
list.add("item" + i);
}
// 使用不可变集合
List<String> immutableList = List.of("A", "B", "C");
}
}
7. 总结
本篇我们学习了:
✅ JVM架构 :类加载、内存模型、执行引擎
✅ 内存结构 :堆、栈、方法区、程序计数器
✅ 垃圾回收 :GC算法、垃圾收集器、GC调优
✅ JVM参数 :内存参数、GC参数、性能参数
✅ 性能监控 :JDK工具、VisualVM、JFR
✅ 优化技巧:字符串优化、集合优化、并发优化
核心要点:
- 理解JVM内存模型是性能优化的基础
- 选择合适的GC收集器对性能影响很大
- 使用监控工具分析性能瓶颈
- 优化代码比调整JVM参数更有效
下一篇预告: 《Java从零到熟练(十一):Spring框架入门》
- 了解Spring框架的核心概念
- 学习Spring Boot快速开发
- 掌握依赖注入和AOP