day2: JVM
上午(3小时):GC算法与调优参数学习
核心目标:掌握CMS、G1、ZGC的核心原理、适用场景及调优参数,理解GC日志分析方法。
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+支持、调优复杂
结合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()
方法流程。
GC日志分析实战
启用GC日志:
日志解析:
关注
Full GC
频率、GC pause
时间、内存回收效率。
2. 学习产出
对比表格:整理CMS/G1/ZGC的核心差异(如适用场景、参数配置)。
GC日志样例:记录不同GC算法的日志片段并标注关键信息。
下午(3小时):JProfiler压测与调优实战
核心目标:通过JProfiler压测不同GC算法,对比性能差异并优化参数。
1. 实战步骤与代码示例
安装与配置JProfiler
下载安装:JProfiler官网(申请试用或购买)。
基础配置:
启动JProfiler,附加到Java进程;
开启“Memory”和“GC Activity”监控视图。
设计压测用例
测试代码:模拟内存分配与对象晋升场景。
执行压测与对比
测试步骤:
CMS测试:
G1测试:
ZGC测试(JDK11+):
JProfiler监控:
记录各GC算法的“GC Pause Time”、“Heap Usage”、“Throughput”。
优化调参
CMS优化:调整
-XX:CMSInitiatingOccupancyFraction=75
(提前触发GC避免Full GC);G1优化:设置
-XX:InitiatingHeapOccupancyPercent=45
(更早启动Mixed GC)。
2. 交付物要求
压测报告:
结构模板:
技术博客:
标题:《Day2:CMS vs G1 vs ZGC——GC算法压测与调优实战》
内容框架:
各GC算法原理总结;
压测设计与JProfiler监控方法;
性能对比与调优建议。
晚上(2小时):总结与输出
整理压测数据:
使用Excel或Markdown表格汇总测试结果;
截图JProfiler监控视图(如GC暂停时间趋势图)。
提交GitHub与文档:
创建仓库(如
gc-pressure-test
),提交测试代码与报告;在博客中嵌入压测报告核心结论。
资源使用建议
书籍重点章节:
《深入理解Java虚拟机》第3章(精读3.4-3.6节);
《Java性能权威指南》第5章(GC调优实战)。
工具与代码参考:
JProfiler官方文档:链接;
OpenJDK GC源码:结合源码理解CMS/G1的回收逻辑。
明日预习(Day3)
核心内容:类加载机制(双亲委派、自定义类加载器);
工具准备:准备加密Class文件(如使用XOR简单加密),编写自定义类加载器。
Day2完成标志:压测代码运行成功、报告结构清晰、博客发布。 若遇到问题:优先查阅《深入理解Java虚拟机》对应章节,或通过JProfiler社区提问。
Last updated