> For the complete documentation index, see [llms.txt](https://keyus-organization.gitbook.io/keyuhan.work/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://keyus-organization.gitbook.io/keyuhan.work/day5-jvm.md).

# Day5: JVM

**上午（3小时）：JVM调优基础与工具学习**

**核心目标**：掌握JVM调优的核心参数、工具使用（VisualVM、JConsole），理解堆大小、线程栈、直接内存的优化策略。

**1. 学习内容与步骤**

1. **精读《深入理解Java虚拟机》第4章**（重点：4.2-4.4节）
   * **核心知识点**：
     * **堆大小调优**：
       * `-Xmx`（最大堆内存）、`-Xms`（初始堆内存）；
       * 新生代与老年代比例（`-XX:NewRatio`）。
     * **线程栈调优**：
       * `-Xss`（线程栈大小），默认1MB，可适当降低以减少内存占用；
       * 线程数过多时，调整栈大小避免`OutOfMemoryError: unable to create new native thread`。
     * **直接内存调优**：
       * `-XX:MaxDirectMemorySize`（限制直接内存大小）；
       * NIO堆外内存泄漏排查（如未释放`ByteBuffer`）。
   * **学习建议**：

     * 整理JVM调优参数表（如下），标注各参数的作用与适用场景。

     | 参数                        | 作用描述      | 示例值                          |
     | ------------------------- | --------- | ---------------------------- |
     | `-Xmx`                    | 最大堆内存     | `-Xmx2g`                     |
     | `-Xms`                    | 初始堆内存     | `-Xms2g`                     |
     | `-Xss`                    | 线程栈大小     | `-Xss512k`                   |
     | `-XX:NewRatio`            | 新生代与老年代比例 | `-XX:NewRatio=2`             |
     | `-XX:MaxDirectMemorySize` | 最大直接内存大小  | `-XX:MaxDirectMemorySize=1g` |
2. **VisualVM与JConsole工具学习**
   * **VisualVM**：
     * 功能：监控JVM内存、线程、GC状态，生成堆内存快照；
     * 安装：[VisualVM官网](https://visualvm.github.io/)；
     * 使用：连接本地/远程Java进程，查看实时性能数据。
   * **JConsole**：
     * 功能：监控JVM内存、线程、类加载、MBean；
     * 使用：运行`jconsole`命令，选择目标进程。
3. **Arthas调优辅助**
   * **常用命令**：
     * `memory`：查看JVM内存使用情况；
     * `thread`：分析线程状态与阻塞问题；
     * `heapdump`：导出堆内存快照供进一步分析。

**2. 学习产出**

* **JVM调优参数表**：整理核心参数及其作用（如上表）；
* **知识笔记**：记录VisualVM与JConsole的使用技巧（如远程连接配置）。

***

**下午（3小时）：线上模拟服务调优实战**

**核心目标**：通过模拟高并发服务，实践JVM调优策略，优化GC暂停时间与内存使用。

**1. 实战步骤与代码示例**

1. **编写模拟高并发服务**
   * **代码示例**：使用线程池处理请求，模拟内存分配与GC压力。

     ```java
     import java.util.concurrent.ExecutorService;  
     import java.util.concurrent.Executors;  

     public class HighConcurrencyService {  
         public static void main(String[] args) {  
             ExecutorService executor = Executors.newFixedThreadPool(100);  
             while (true) {  
                 executor.submit(() -> {  
                     byte[] data = new byte[1024 * 1024]; // 每次分配1MB内存  
                     try {  
                         Thread.sleep(100); // 模拟业务处理时间  
                     } catch (InterruptedException e) {  
                         e.printStackTrace();  
                     }  
                 });  
             }  
         }  
     }  
     ```
2. **运行服务并监控性能**
   * **JVM参数**：

     ```bash
     java -Xmx512m -Xms512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 HighConcurrencyService  
     ```
   * **监控工具**：
     * 使用VisualVM连接服务，观察内存、线程、GC状态；
     * 使用Arthas监控方法调用耗时（如`trace`命令）。
3. **调优策略实施**
   * **优化堆大小**：
     * 调整`-Xmx`与`-Xms`为1GB，观察GC频率与暂停时间变化；
     * 对比`-XX:NewRatio=2`与`-XX:NewRatio=3`的性能差异。
   * **优化GC算法**：
     * 对比G1与CMS的性能（如GC暂停时间、吞吐量）；
     * 调整G1的`-XX:MaxGCPauseMillis`为100ms，观察效果。
   * **优化线程栈**：
     * 调整`-Xss`为256KB，减少内存占用，观察线程创建数量上限。
4. **性能对比与报告生成**
   * **测试结果**：

     | 调优策略            | GC暂停时间（ms） | 吞吐量（请求/秒） | 内存使用（MB） |
     | --------------- | ---------- | --------- | -------- |
     | 默认参数（G1, 512MB） | 200        | 500       | 480      |
     | 调整堆大小（1GB）      | 150        | 600       | 900      |
     | 调整GC算法（CMS）     | 100        | 550       | 500      |
     | 调整线程栈（256KB）    | 200        | 500       | 400      |

**2. 交付物要求**

1. **调优报告**：
   * **结构模板**：

     ```
     ## 测试环境  
     - JDK版本：11.0.12  
     - 堆大小：512MB → 1GB  
     - GC算法：G1 → CMS  
     ## 测试结果  
     | 调优策略                | GC暂停时间（ms） | 吞吐量（请求/秒） | 内存使用（MB） |  
     |-------------------------|------------------|-------------------|----------------|  
     | 默认参数（G1, 512MB）   | 200              | 500               | 480            |  
     | 调整堆大小（1GB）       | 150              | 600               | 900            |  
     ## 优化建议  
     - 建议将堆大小调整为1GB，GC暂停时间降低25%；  
     - 建议使用CMS算法，进一步减少GC暂停时间。  
     ```
2. **性能监控截图**：
   * 提交VisualVM监控视图（如内存使用趋势、GC日志）；
   * 提交Arthas命令输出（如`memory`、`thread`）。

***

**晚上（2小时）：总结与输出**

1. **技术博客**：
   * **标题**：《Day5：JVM调优实战——从堆大小到GC算法的性能优化》
   * **内容框架**：
     * JVM调优核心参数详解；
     * 模拟高并发服务的调优过程；
     * 性能对比与优化建议。
2. **提交GitHub与文档**：
   * 创建仓库（如`jvm-tuning-demo`），提交以下内容：
     * `HighConcurrencyService.java`（模拟代码）；
     * `调优报告.md`（详细调优过程与结果）；
     * 性能监控截图（VisualVM、Arthas输出）。
   * **README.md**：说明如何复现测试及调优步骤。

***

#### **资源使用建议**

1. **书籍重点章节**：
   * 《深入理解Java虚拟机》第4章（精读4.2-4.4节）；
   * 《Java性能权威指南》第6章（JVM调优实战）。
2. **工具与代码参考**：
   * **VisualVM官方文档**：[链接](https://visualvm.github.io/documentation.html)；
   * **G1 GC调优指南**：[Oracle官方文档](https://docs.oracle.com/javase/9/gctuning/garbage-first-garbage-collector.htm)。

***

#### **明日预习（Day6）**

* **核心内容**：并发基础（synchronized、CAS、AQS）；
* **工具准备**：准备多线程测试用例（如生产者-消费者模型）。

**Day5完成标志**：调优报告完整、性能监控数据清晰、博客发布。\
**若遇到问题**：优先查阅《深入理解Java虚拟机》第4章，或在Stack Overflow搜索“JVM tuning example”。
