> 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/day2-jvm.md).

# day2: JVM

**上午（3小时）：GC算法与调优参数学习**

**核心目标**：掌握CMS、G1、ZGC的核心原理、适用场景及调优参数，理解GC日志分析方法。

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

1. **精读《深入理解Java虚拟机》第3章**（重点：3.4-3.6节）
   * **核心知识点**：
     * **CMS（Concurrent Mark Sweep）**：
       * 阶段：初始标记（STW）、并发标记、重新标记（STW）、并发清除。
       * 适用场景：低延迟应用（如Web服务），但内存碎片化严重。
       * **关键参数**：`-XX:+UseConcMarkSweepGC`、`-XX:CMSInitiatingOccupancyFraction=70`（老年代70%时触发GC）。
     * **G1（Garbage-First）**：
       * 分区模型（Region）、Mixed GC（年轻代+部分老年代回收）。
       * **关键参数**：`-XX:+UseG1GC`、`-XX:MaxGCPauseMillis=200`（目标暂停时间）。
     * **ZGC（Z Garbage Collector）**：
       * 基于染色指针（Colored Pointers）、NUMA感知，适合大堆内存（TB级）。
       * **关键参数**：`-XX:+UseZGC`、`-XX:ZAllocationSpikeTolerance=5`（分配速率容忍度）。
   * **学习建议**：

     * 整理对比表格（如下），标注各GC算法的优缺点：

     | GC算法 | 适用场景         | 优点          | 缺点              |
     | ---- | ------------ | ----------- | --------------- |
     | CMS  | 低延迟、中小堆内存    | 并发收集，停顿时间短  | 内存碎片、Full GC时间长 |
     | G1   | 大堆内存、平衡吞吐/延迟 | 可预测停顿、分区回收  | 内存占用高           |
     | ZGC  | 超大堆内存、极低延迟   | 亚毫秒级停顿、扩展性强 | JDK11+支持、调优复杂   |
2. **结合OpenJDK源码验证GC实现**
   * **源码定位**：
     * CMS源码路径：`src/hotspot/share/gc/cms`
     * G1源码路径：`src/hotspot/share/gc/g1`
     * ZGC源码路径：`src/hotspot/share/gc/z`
   * **实践建议**：
     * 使用IDE（如IntelliJ）打开`concurrentMarkSweepGeneration.cpp`（CMS核心逻辑），关注`collect()`方法流程。
3. **GC日志分析实战**
   * **启用GC日志**：

     ```bash
     # CMS示例  
     java -XX:+UseConcMarkSweepGC -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar your_app.jar  

     # G1示例  
     java -XX:+UseG1GC -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar your_app.jar  
     ```
   * **日志解析**：
     * 关注`Full GC`频率、`GC pause`时间、内存回收效率。

**2. 学习产出**

* **对比表格**：整理CMS/G1/ZGC的核心差异（如适用场景、参数配置）。
* **GC日志样例**：记录不同GC算法的日志片段并标注关键信息。

***

**下午（3小时）：JProfiler压测与调优实战**

**核心目标**：通过JProfiler压测不同GC算法，对比性能差异并优化参数。

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

1. **安装与配置JProfiler**
   * **下载安装**：[JProfiler官网](https://www.ej-technologies.com/products/jprofiler/overview.html)（申请试用或购买）。
   * **基础配置**：
     * 启动JProfiler，附加到Java进程；
     * 开启“Memory”和“GC Activity”监控视图。
2. **设计压测用例**
   * **测试代码**：模拟内存分配与对象晋升场景。

     ```java
     public class GCTest {  
         public static void main(String[] args) throws InterruptedException {  
             List<byte[]> list = new ArrayList<>();  
             while (true) {  
                 // 分配1MB对象，触发GC  
                 byte[] data = new byte[1024 * 1024];  
                 list.add(data);  
                 Thread.sleep(10);  
             }  
         }  
     }  
     ```
3. **执行压测与对比**
   * **测试步骤**：
     1. **CMS测试**：

        ```bash
        java -XX:+UseConcMarkSweepGC -Xmx512m -Xms512m -jar GCTest.jar  
        ```
     2. **G1测试**：

        ```bash
        java -XX:+UseG1GC -Xmx512m -Xms512m -XX:MaxGCPauseMillis=200 -jar GCTest.jar  
        ```
     3. **ZGC测试（JDK11+）**：

        ```bash
        java -XX:+UseZGC -Xmx512m -Xms512m -jar GCTest.jar  
        ```
   * **JProfiler监控**：
     * 记录各GC算法的“GC Pause Time”、“Heap Usage”、“Throughput”。
4. **优化调参**
   * **CMS优化**：调整`-XX:CMSInitiatingOccupancyFraction=75`（提前触发GC避免Full GC）；
   * **G1优化**：设置`-XX:InitiatingHeapOccupancyPercent=45`（更早启动Mixed GC）。

**2. 交付物要求**

1. **压测报告**：
   * **结构模板**：

     ```
     ## 测试环境  
     - JDK版本：11.0.12  
     - 堆大小：512MB  
     ## 测试结果  
     | GC算法 | 平均GC暂停时间（ms） | Full GC次数 | 吞吐量（%） |  
     |--------|----------------------|-------------|------------|  
     | CMS    | 50                   | 2           | 95.2       |  
     | G1     | 30                   | 0           | 97.8       |  
     | ZGC    | 2                    | 0           | 99.1       |  
     ## 优化建议  
     - CMS：建议增加老年代预留空间，避免内存碎片。  
     - G1：适当降低`MaxGCPauseMillis`以平衡吞吐与延迟。  
     ```
2. **技术博客**：
   * **标题**：《Day2：CMS vs G1 vs ZGC——GC算法压测与调优实战》
   * **内容框架**：
     * 各GC算法原理总结；
     * 压测设计与JProfiler监控方法；
     * 性能对比与调优建议。

***

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

1. **整理压测数据**：
   * 使用Excel或Markdown表格汇总测试结果；
   * 截图JProfiler监控视图（如GC暂停时间趋势图）。
2. **提交GitHub与文档**：
   * 创建仓库（如`gc-pressure-test`），提交测试代码与报告；
   * 在博客中嵌入压测报告核心结论。

***

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

1. **书籍重点章节**：
   * 《深入理解Java虚拟机》第3章（精读3.4-3.6节）；
   * 《Java性能权威指南》第5章（GC调优实战）。
2. **工具与代码参考**：
   * **JProfiler官方文档**：[链接](https://www.ej-technologies.com/resources/jprofiler/help/doc/)；
   * **OpenJDK GC源码**：结合源码理解CMS/G1的回收逻辑。

***

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

* **核心内容**：类加载机制（双亲委派、自定义类加载器）；
* **工具准备**：准备加密Class文件（如使用XOR简单加密），编写自定义类加载器。

**Day2完成标志**：压测代码运行成功、报告结构清晰、博客发布。\
**若遇到问题**：优先查阅《深入理解Java虚拟机》对应章节，或通过JProfiler社区提问。
