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

# day1: JVM

**上午（3小时）：JVM内存模型学习**

**核心目标**：理解JVM内存区域划分、对象分配与回收机制。

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

1. **精读《深入理解Java虚拟机》第2章**（重点：2.2-2.4节）
   * **核心知识点**：
     * **堆（Heap）**：新生代（Eden、Survivor）、老年代（Old Generation）的作用；
     * **栈（Stack）**：虚拟机栈、本地方法栈的帧结构（局部变量表、操作数栈）；
     * **方法区（Method Area）**：JDK 8后由元空间（Metaspace）替代，存储类信息、常量池；
     * **直接内存（Direct Memory）**：NIO的堆外内存分配机制。
   * **学习建议**：
     * 用思维导图整理各内存区域的功能及交互关系（示例工具：XMind）。
2. **结合OpenJDK源码验证内存模型**
   * **源码定位**：
     * HotSpot JVM内存管理源码路径：`src/hotspot/share/memory`
     * 关键类：`heap.hpp`（堆实现）、`metaspace.hpp`（元空间实现）。
   * **实践建议**：
     * 下载OpenJDK源码（[GitHub链接](https://github.com/openjdk/jdk)），使用IDE（如IntelliJ）阅读`heap.cpp`中的内存分配逻辑。
3. **Arthas工具初探**
   * **安装与基础命令**：

     ```bash
     curl -O https://arthas.aliyun.com/arthas-boot.jar  
     java -jar arthas-boot.jar  
     ```
   * **快速体验**：
     * 输入`dashboard`查看内存/线程实时状态；
     * 输入`heapdump`导出堆内存快照（为下午的实战做准备）。

**2. 学习产出**

* **知识笔记**：整理JVM内存模型的核心要点（如堆与栈的区别、元空间与永久代的对比）。
* **疑问记录**：标记不理解的概念（如“TLAB分配”），留待后续解决。

***

**下午（3小时）：手写简化版JVM内存分配器**

**核心目标**：模拟JVM堆内存分配流程，理解对象分配与GC触发条件。

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

1. **设计内存分配器结构**
   * **功能需求**：
     * 模拟Eden区分配，空间不足时触发Minor GC；
     * 对象晋升：存活对象从Eden复制到Survivor区。
   * **类定义**：

     ```java
     public class SimpleJVM {  
         private static final int EDEN_SIZE = 64 * 1024; // 64KB  
         private byte[] eden = new byte[EDEN_SIZE];  
         private int edenPointer = 0;  
         private byte[] survivor = new byte[EDEN_SIZE]; // Survivor区  
         private int survivorPointer = 0;  

         // 分配内存（返回分配地址偏移量）  
         public int allocate(int size) {  
             if (edenPointer + size > EDEN_SIZE) {  
                 minorGC(); // Eden区满，触发Minor GC  
                 edenPointer = 0;  
             }  
             int address = edenPointer;  
             edenPointer += size;  
             return address;  
         }  

         // 模拟Minor GC：将存活对象复制到Survivor  
         private void minorGC() {  
             System.out.println("=== Minor GC Triggered ===");  
             survivorPointer = 0;  
             // 假设所有对象存活（简化逻辑）  
             System.arraycopy(eden, 0, survivor, 0, edenPointer);  
             survivorPointer = edenPointer;  
         }  
     }  
     ```
2. **测试与验证**
   * **测试用例**：

     ```java
     public static void main(String[] args) {  
         SimpleJVM jvm = new SimpleJVM();  
         // 分配3个对象（每个20KB）  
         jvm.allocate(20 * 1024); // 对象1  
         jvm.allocate(20 * 1024); // 对象2  
         jvm.allocate(20 * 1024); // 触发GC，对象3分配失败  
     }  
     ```
   * **预期输出**：

     ```
     === Minor GC Triggered ===  
     ```
3. **优化与扩展（可选）**
   * **添加老年代**：当Survivor区满时，对象晋升到老年代；
   * **模拟GC日志**：记录GC时间、内存回收量。

**2. 交付物要求**

1. **GitHub代码**：
   * 创建仓库（如`simple-jvm-allocation`），提交完整代码；
   * 添加README.md，说明设计思路与测试方法。
2. **内存分配流程图**：
   * **工具推荐**：Draw\.io、Excalidraw；
   * **内容要求**：标注Eden、Survivor、对象分配与GC流程。
   * **示例图核心节点**：

     ```
     [对象分配请求] → [Eden区空间检查] → [足够则分配]  
                          ↓  
                     [不足则触发GC] → [存活对象复制到Survivor]  
     ```

***

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

1. **技术博客**：
   * **标题**：《Day1：手写JVM内存分配器——从理论到实践》
   * **内容框架**：
     * JVM内存模型核心知识点总结；
     * 代码设计思路与关键实现；
     * 遇到的问题与解决方案（如GC触发条件）。
2. **提交GitHub与文档**：
   * 推送代码至仓库，附流程图和博客链接；
   * 在本地或云笔记中归档Day1学习记录。

***

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

1. **书籍重点章节**：
   * 《深入理解Java虚拟机》第2章（精读2.2-2.4节）；
   * 《Java并发编程实战》第2章（了解内存可见性问题）。
2. **开源代码参考**：
   * OpenJDK的`heap.cpp`（路径：`src/hotspot/share/memory/heap.cpp`）；
   * Arthas的`heapdump`命令实现（[源码链接](https://github.com/alibaba/arthas/blob/master/core/src/main/java/com/taobao/arthas/core/command/monitor200/HeapDumpCommand.java)）。

***

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

* **核心内容**：GC算法（CMS、G1、ZGC）与调优参数；
* **工具准备**：安装JProfiler（[官网下载](https://www.ej-technologies.com/products/jprofiler/overview.html)），准备测试用例。

**Day1完成标志**：代码运行成功、流程图清晰、博客发布。\
**若遇到问题**：优先查阅书籍对应章节，其次在GitHub提交Issue或Stack Overflow提问。
