1 分钟阅读
Java 进阶 02:JVM 运行时、GC 与调参入门(从现象到证据)
堆/栈/元空间、对象分配与 TLAB、常见 GC 算法对比、GC 日志与 jcmd/jstack 入门;Stop-The-World 与延迟取舍,避免迷信参数大全。
- Java
- JVM
- GC
- 性能
AI 共读让 Noob 帮你提炼要点 / 答疑
本篇目标:能说清堆、栈、元空间职责;知道 Young/Old GC 直觉;能打开 GC 日志并从 pause 与频次入手分析;避免「盲目 -Xmx」。
1. 知识点:运行时数据区(HotSpot 心智)#
| 区域 | 存什么 | GC 参与 |
|---|---|---|
| 虚拟机栈 | 栈帧、局部变量 | 否 |
| 堆 | 对象实例 | 是(主战场) |
| 元空间 | 类元数据 | 部分回收/卸载 |
| 直接内存 | NIO Buffer 等 | Cleaner,需警惕泄漏 |
2. 知识点:分代收集直觉#
- Young GC:短命对象批量回收,通常频繁但 pause 较短(取决于收集器与存活)。
- Old/Major:老年代不足或晋升失败触发;pause 往往更长。
- Full GC:整堆压缩类操作(口语常混用);需看具体收集器日志。
分配速率:单位时间新建对象量过高 → Young GC 过密 → CPU 消耗在 GC。
3. 知识点:常用 JVM 参数(JDK 11+,示例)#
具体收集器名随 JDK 变化,以官方文档为准;原则是「先开日志,再调堆」。
-Xms2g -Xmx2g
-XX:+AlwaysPreTouch
-XX:+UseStringDeduplication # 视场景
-Xlog:gc*:file=gc.log:time,uptime,level,tags学以致用:堆 -Xms=-Xmx 减少 resize;生产开启 GC 日志轮转。
4. 知识点:诊断命令(示例)#
jcmd <pid> VM.flags
jcmd <pid> GC.heap_info
jstack <pid> > threads.txtCPU 高:优先线程栈看锁与 RUNNABLE 热点;再结合剖析工具。
5. Lab#
写循环分配短命 byte[](例如 1MB × N),固定堆 512MB,打开 -Xlog:gc*,记录 Young GC 次数与最大 pause。
6. 自测清单#
- 栈溢出 vs 堆 OOM 典型栈特征?
- 为何「增大堆」不一定降低 pause?
- Young GC 过密可能说明什么?
- 如何用
jstack怀疑死锁?
下一篇:Spring 事务与集成边界。
相关阅读
基于内容相似度 + 标签/系列加权
- 1 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 精通 02:性能剖析、容量规划与可观测性(指标 · 日志 · 链路)
专家必备:从基准测试误区到火焰图/JFR、线程与分配剖析;RED/USE 类指标、结构化日志、分布式追踪与 SLO;压测如何服务于容量决策。
- Java
- 性能
- 可观测性
- 2 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 基础 01:平台、JDK、字节码与可维护的最小项目骨架
写给初级工程师:JVM/JRE/JDK 分工、源码到字节码的路径、classpath 与模块的基础心智;用 Maven 或 Gradle 搭一个最小可测试骨架。
- Java
- JVM
- 基础
- 2 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 进阶 01:JUC、线程池、CompletableFuture 与异步组合实战
写给高级工程师:happens-before 直觉、Lock 与原子类、ExecutorService 参数含义、超时/取消/组合异步;常见踩坑与背压入门。
- Java
- 并发
- JUC
- 2 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 基础 03:异常体系、try-with-resources、IO/NIO.2 入门与并发初探
初级收尾篇:受检/非受检异常取舍、异常链与日志;现代 IO 用法;线程与 synchronized 的最小正确用法,为进阶 JUC 铺路。
- Java
- 异常
- IO