Java从零到熟练(十):JVM基础与性能优化

理解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

优化技巧:字符串优化、集合优化、并发优化

核心要点:

  1. 理解JVM内存模型是性能优化的基础
  2. 选择合适的GC收集器对性能影响很大
  3. 使用监控工具分析性能瓶颈
  4. 优化代码比调整JVM参数更有效

下一篇预告: 《Java从零到熟练(十一):Spring框架入门》

  • 了解Spring框架的核心概念
  • 学习Spring Boot快速开发
  • 掌握依赖注入和AOP

参考资源

  1. JVM官方文档
  2. Java性能优化指南
  3. 廖雪峰Java教程 - JVM简介

下一篇: Java从零到熟练(十一):Spring框架入门

相关推荐
Demon1_Coder1 小时前
Day1-SpringAI-1.0.0版本
java·开发语言·前端
念越1 小时前
数据库系统概论第6版王珊版:第二章关系代数与第三章SQL期末重点整理
数据库·sql·性能优化
老码观察1 小时前
设计模式实战解读(九):责任链模式——流水线上层层把关的艺术
java·设计模式·责任链模式
basketball6161 小时前
C++进阶:2. std::move 和 std::forward 函数
java·开发语言·c++
霸道流氓气质1 小时前
Maven 批处理脚本与 Qoder 配置使用指南
java·maven
禅思院1 小时前
大列表性能优化 · 面试精讲 · 一
面试·职场和发展·性能优化
架构源启1 小时前
Spring AI进阶系列(14)- 2026 可观测性最佳实践:从链路追踪到企业级 AI 治理落地
java·人工智能·spring
码上有光1 小时前
c++: 继承(下)
android·java·c++·多继承·菱形继承·虚继承
JAVA9651 小时前
JAVA面试-并发篇 02-synchronized 锁可以重入吗
java·面试