day1: JVM
上午(3小时):JVM内存模型学习
核心目标:理解JVM内存区域划分、对象分配与回收机制。
1. 学习内容与步骤
精读《深入理解Java虚拟机》第2章(重点:2.2-2.4节)
核心知识点:
堆(Heap):新生代(Eden、Survivor)、老年代(Old Generation)的作用;
栈(Stack):虚拟机栈、本地方法栈的帧结构(局部变量表、操作数栈);
方法区(Method Area):JDK 8后由元空间(Metaspace)替代,存储类信息、常量池;
直接内存(Direct Memory):NIO的堆外内存分配机制。
学习建议:
用思维导图整理各内存区域的功能及交互关系(示例工具:XMind)。
结合OpenJDK源码验证内存模型
源码定位:
HotSpot JVM内存管理源码路径:
src/hotspot/share/memory
关键类:
heap.hpp
(堆实现)、metaspace.hpp
(元空间实现)。
实践建议:
下载OpenJDK源码(GitHub链接),使用IDE(如IntelliJ)阅读
heap.cpp
中的内存分配逻辑。
Arthas工具初探
安装与基础命令:
快速体验:
输入
dashboard
查看内存/线程实时状态;输入
heapdump
导出堆内存快照(为下午的实战做准备)。
2. 学习产出
知识笔记:整理JVM内存模型的核心要点(如堆与栈的区别、元空间与永久代的对比)。
疑问记录:标记不理解的概念(如“TLAB分配”),留待后续解决。
下午(3小时):手写简化版JVM内存分配器
核心目标:模拟JVM堆内存分配流程,理解对象分配与GC触发条件。
1. 实战步骤与代码示例
设计内存分配器结构
功能需求:
模拟Eden区分配,空间不足时触发Minor GC;
对象晋升:存活对象从Eden复制到Survivor区。
类定义:
测试与验证
测试用例:
预期输出:
优化与扩展(可选)
添加老年代:当Survivor区满时,对象晋升到老年代;
模拟GC日志:记录GC时间、内存回收量。
2. 交付物要求
GitHub代码:
创建仓库(如
simple-jvm-allocation
),提交完整代码;添加README.md,说明设计思路与测试方法。
内存分配流程图:
工具推荐:Draw.io、Excalidraw;
内容要求:标注Eden、Survivor、对象分配与GC流程。
示例图核心节点:
晚上(2小时):总结与输出
技术博客:
标题:《Day1:手写JVM内存分配器——从理论到实践》
内容框架:
JVM内存模型核心知识点总结;
代码设计思路与关键实现;
遇到的问题与解决方案(如GC触发条件)。
提交GitHub与文档:
推送代码至仓库,附流程图和博客链接;
在本地或云笔记中归档Day1学习记录。
资源使用建议
书籍重点章节:
《深入理解Java虚拟机》第2章(精读2.2-2.4节);
《Java并发编程实战》第2章(了解内存可见性问题)。
开源代码参考:
OpenJDK的
heap.cpp
(路径:src/hotspot/share/memory/heap.cpp
);Arthas的
heapdump
命令实现(源码链接)。
明日预习(Day2)
核心内容:GC算法(CMS、G1、ZGC)与调优参数;
工具准备:安装JProfiler(官网下载),准备测试用例。
Day1完成标志:代码运行成功、流程图清晰、博客发布。 若遇到问题:优先查阅书籍对应章节,其次在GitHub提交Issue或Stack Overflow提问。
Last updated