返回 随笔记录
随笔记录

二、JVM与性能优化

博主
大约 15 分钟

二、JVM与性能优化

范围:内存模型、垃圾回收、JIT编译、调优工具、字节码、类加载机制、性能调优实战 知识点数量:119项 → 扩展至250+项 返回总目录


2.1 JVM内存模型

2.1.1 运行时数据区

  • 173. 程序计数器 - 理解线程私有,掌握字节码行号记录
  • 174. Java虚拟机栈 - 理解栈帧结构,掌握局部变量表和操作数栈
  • 175. 本地方法栈 - 理解Native方法调用,掌握与虚拟机栈区别
  • 176. 堆内存结构 - 掌握新生代、老年代划分,理解Eden和Survivor
  • 177. 方法区/元空间 - 理解类信息存储,掌握JDK 8元空间变化
  • 178. 运行时常量池 - 掌握字符串常量池,理解class常量池
  • 179. 直接内存 - 理解NIO的ByteBuffer.allocateDirect,掌握堆外内存
  • 180. 栈帧结构详解 - 掌握局部变量表、操作数栈、动态链接、方法返回地址
  • 181. 栈深度限制 - 理解-Xss参数,掌握栈溢出预防
  • 182. 堆内存分区 - 掌握年轻代/老年代/永久代(元空间)比例
  • 183. Survivor区设计 - 理解S0/S1对称设计和对象晋升
  • 184. TLAB(Thread Local Allocation Buffer) - 掌握线程本地分配缓冲
  • 185. 堆外内存管理 - 掌握DirectByteBuffer内存释放
  • 186. 内存区域线程共享性 - 理解堆/方法区共享,栈/程序计数器私有

2.1.2 对象内存布局

  • 187. 对象创建过程 - 掌握类加载检查、分配内存、初始化
  • 188. 对象头结构 - 掌握Mark Word和Klass Pointer
  • 189. 实例数据与对齐填充 - 理解8字节对齐,掌握内存计算
  • 190. 对象访问定位 - 理解句柄和直接指针两种方式
  • 191. 对象大小计算 - 掌握Instrumentation.sizeof,理解jol工具
  • 192. Mark Word详解 - 掌握锁状态、GC标记、hashCode存储
  • 193. 对象内存分配 - 掌握指针碰撞和空闲列表
  • 194. 大对象处理 - 理解直接分配到老年代
  • 195. 对象年龄计算 - 掌握对象年龄计数器
  • 196. 数组对象布局 - 理解数组长度的额外存储
  • 197. 对象压缩指针 - 掌握-XX:+UseCompressedOops
  • 198. 对象内存对齐 - 理解填充字段的作用

2.1.3 内存溢出与泄漏

  • 199. StackOverflowError - 理解栈溢出原因,掌握递归深度控制
  • 200. OutOfMemoryError: Java heap space - 掌握堆溢出排查
  • 201. OOM: Metaspace - 理解元空间溢出,掌握类加载排查
  • 202. OOM: GC overhead limit exceeded - 理解GC效率问题
  • 203. OOM: Direct buffer memory - 掌握堆外内存泄漏
  • 204. 内存泄漏排查 - 掌握MAT工具,理解GC Roots分析
  • 205. 内存泄漏场景 - 理解静态集合、ThreadLocal等常见泄漏
  • 206. OOM: unable to create new native thread - 掌握线程数限制
  • 207. OOM: Requested array size exceeds VM limit - 理解数组大小限制
  • 208. 内存泄漏预防 - 掌握弱引用、try-with-resources
  • 209. Dump文件分析 - 掌握hprof文件格式
  • 210. 内存泄漏工具 - 掌握Eclipse MAT、JProfiler

2.2 垃圾回收

2.2.1 GC基础

  • 211. 判断对象存活 - 掌握引用计数法和可达性分析法
  • 212. GC Roots - 掌握虚拟机栈、静态属性等根节点
  • 213. 强软弱虚引用 - 掌握Reference体系,理解适用场景
  • 214. finalize方法 - 理解对象复活机制,掌握try-with-resources替代
  • 215. 跨代引用与卡表 - 理解分代GC优化,掌握卡表原理
  • 216. 引用计数法缺陷 - 理解循环引用问题
  • 217. GC Roots枚举 - 掌握OopMap数据结构
  • 218. 安全点与安全区域 - 理解GC暂停位置
  • 219. StrongReference - 掌握强引用特点
  • 220. SoftReference - 掌握软引用,理解内存敏感缓存
  • 221. WeakReference - 掌握弱引用,理解WeakHashMap
  • 222. PhantomReference - 掌握虚引用,理解对象回收通知
  • 223. ReferenceQueue - 掌握引用队列使用
  • 224. finalize执行时机 - 理解不确定性和风险
  • 225. Cleaner机制 - 掌握Java 9清理器

2.2.2 垃圾回收算法

  • 226. 标记-清除算法 - 理解标记和清除两阶段,掌握碎片问题
  • 227. 标记-复制算法 - 理解Eden到Survivor复制,掌握空间利用率
  • 228. 标记-整理算法 - 理解压缩整理,掌握老年代回收
  • 229. 分代收集理论 - 理解弱分代假说和强分代假说
  • 230. 三色标记法 - 理解并发GC基础,掌握GC Barrier
  • 231. 读写屏障 - 理解屏障机制,掌握ZGC/Shenandoah应用
  • 232. 增量更新 - 理解CMS的并发标记策略
  • 233. 原始快照(SATB) - 理解G1的并发标记策略
  • 234. 对象晋升机制 - 掌握年龄阈值和动态年龄判断
  • 235. 担保机制 - 理解空间分配担保

2.2.3 垃圾回收器

  • 236. Serial收集器 - 理解单线程GC,掌握Client模式应用
  • 237. ParNew收集器 - 理解Serial多线程版本
  • 238. Parallel Scavenge - 掌握吞吐量优先,理解-XX:MaxGCPauseMillis
  • 239. Serial Old - 理解老年代串行收集器
  • 240. Parallel Old - 理解老年代并行收集器
  • 241. CMS收集器 - 掌握低延迟GC,理解四阶段流程
  • 242. CMS浮动垃圾 - 理解并发标记问题,掌握Remarked阶段
  • 243. G1收集器 - 掌握Region划分,理解Mixed GC
  • 244. G1 Humongous对象 - 理解大对象处理,掌握Region优化
  • 245. ZGC - 掌握彩色指针和读屏障,理解亚毫秒停顿
  • 246. Shenandoah - 理解并发整理,掌握与ZGC对比
  • 247. 收集器选择策略 - 掌握根据场景选择合适GC
  • 248. CMS降级 - 理解Concurrent Mode Failure
  • 249. G1 Mixed GC - 掌握部分老年代回收
  • 250. G1 Full GC - 理解单线程Full GC问题
  • 251. ZGC分层代 - 掌握Java 21分代ZGC
  • 252. Epsilon GC - 理解无操作GC,掌握性能测试
  • 253. GC日志解读 - 掌握GC暂停时间、吞吐量指标
  • 254. GC调优参数 - 掌握-XX:+UseG1GC等参数
  • 255. GC停顿时间预测 - 掌握-XX:MaxGCPauseMillis
  • 256. 吞吐量调优 - 掌握-XX:GCTimeRatio

2.3 JIT编译

2.3.1 编译层次

  • 257. 解释执行 - 理解字节码解释器,掌握执行流程
  • 258. C1编译器 - 掌握Client编译器,理解快速编译
  • 259. C2编译器 - 掌握Server编译器,理解深度优化
  • 260. 分层编译 - 理解0-4层编译级别,掌握切换策略
  • 261. 热点代码探测 - 掌握方法调用计数和回边计数
  • 262. 解释器模式 - 掌握模板解释器和字节码解释器
  • 263. 编译触发条件 - 掌握方法调用阈值
  • 264. 栈上替换(OSR) - 理解循环编译优化
  • 265. 编译线程 - 掌握C1/C2编译线程配置
  • 266. 代码缓存 - 理解-XX:ReservedCodeCacheSize

2.3.2 优化技术

  • 267. 方法内联 - 理解消除调用开销,掌握-XX:MaxInlineSize
  • 268. 逃逸分析 - 掌握标量替换和锁消除
  • 269. 公共子表达式消除 - 理解冗余计算优化
  • 270. 数组边界检查消除 - 理解安全检查优化
  • 271. 循环展开与循环剥离 - 掌握循环优化技术
  • 272. 死码消除 - 理解无效代码移除
  • 273. 类型推测 - 掌握Monomorphic/Bimorphic优化
  • 274. 去优化(Deoptimization) - 理解假设失败回退
  • 275. 锁优化 - 掌握偏向锁、轻量级锁、锁消除
  • 276. 虚方法内联 - 掌握CHA(Class Hierarchy Analysis)
  • 277. 循环不变量外提 - 理解循环优化
  • 278. 分支预测优化 - 掌握Profile Guided Optimization
  • 279. 寄存器分配 - 理解线性扫描算法
  • 280. 指令调度 - 掌握指令重排优化

2.3.3 性能分析

  • 281. JITWatch工具 - 掌握编译日志分析
  • 282. 编译阈值设置 - 掌握-XX:CompileThreshold
  • 283. 编译日志查看 - 理解-XX:+PrintCompilation输出
  • 284. 热点方法识别 - 掌握JFR和JMC使用
  • 285. 编译失败处理 - 理解C1/C2编译失败原因
  • 286. 内联日志分析 - 掌握-XX:+PrintInlining
  • 287. 编译时间分析 - 理解编译开销
  • 288. 热点代码可视化 - 掌握JITWatch图形界面
  • 289. 方法内联决策 - 理解内联失败原因
  • 290. 性能对比测试 - 掌握JMH基准测试

2.4 调优工具

2.4.1 命令行工具

  • 291. jps - 掌握JVM进程查看
  • 292. jstat - 掌握GC统计信息监控
  • 293. jinfo - 掌握JVM参数查看和修改
  • 294. jmap - 掌握堆Dump生成
  • 295. jstack - 掌握线程Dump获取
  • 296. jcmd - 掌握统一诊断命令
  • 297. jhsdb - 掌握JDK 9+调试工具
  • 298. jstat -gc - 掌握GC统计信息
  • 299. jstat -gccause - 掌握GC原因分析
  • 300. jmap -histo - 掌握对象直方图
  • 301. jmap -dump - 掌握堆转储
  • 302. jstack -l - 掌握锁信息查看
  • 303. jcmd GC.run - 掌握手动触发GC
  • 304. jcmd VM.flags - 掌握JVM参数查看

2.4.2 可视化工具

  • 305. JConsole - 掌握JMX监控,理解MBean
  • 306. VisualVM - 掌握CPU/内存分析,理解插件扩展
  • 307. JFR (Java Flight Recorder) - 掌握低开销 profiling
  • 308. JMC (Java Mission Control) - 掌握JFR数据分析
  • 309. MAT (Memory Analyzer) - 掌握堆分析,理解Dominator Tree
  • 310. Arthas - 掌握在线诊断,理解dashboard、trace等命令
  • 311. async-profiler - 掌握火焰图生成,理解性能热点分析
  • 312. JProfiler - 掌握商业性能分析工具
  • 313. YourKit - 掌握内存和CPU分析
  • 314. GC Easy - 掌握GC日志在线分析
  • 315. Java VisualVM插件 - 掌握VisualGC等插件
  • 316. Arthas profiler - 掌握火焰图生成
  • 317. Arthas dashboard - 掌握实时仪表板

2.4.3 日志与监控

  • 318. GC日志配置 - 掌握-XX:+PrintGCDetails等参数
  • 319. GC日志分析 - 掌握GC Easy等在线工具
  • 320. JVM参数调优 - 掌握常用调优参数
  • 321. Prometheus + JMX Exporter - 掌握指标暴露
  • 322. Grafana JVM Dashboard - 掌握可视化监控
  • 323. 自定义Metrics - 掌握Micrometer集成
  • 324. GC日志轮转 - 掌握-XX:+UseGCLogFileRotation
  • 325. Unified GC Logging - 掌握Java 9统一日志
  • 326. JMX远程访问 - 掌握远程监控配置
  • 327. 自定义MBean - 掌握业务指标暴露
  • 328. 告警配置 - 掌握Prometheus AlertManager
  • 329. APM工具 - 掌握SkyWalking、Pinpoint

2.5 字节码

2.5.1 Class文件结构

  • 330. 魔数与版本号 - 理解CAFEBABE和版本兼容
  • 331. 常量池 - 掌握常量类型和索引机制
  • 332. 访问标志 - 理解类修饰符
  • 333. 字段表集合 - 掌握字段描述信息
  • 334. 方法表集合 - 掌握方法描述和Code属性
  • 335. 属性表集合 - 理解SourceFile、LineNumberTable等
  • 336. javap反汇编 - 掌握字节码查看
  • 337. 常量池类型 - 掌握Utf8、Integer、String等
  • 338. 接口索引 - 理解implements接口记录
  • 339. 属性详解 - 掌握Code、Exceptions、Deprecated等
  • 340. LineNumberTable - 掌握调试信息
  • 341. LocalVariableTable - 掌握局部变量调试信息
  • 342. StackMapTable - 掌握验证类型信息
  • 343. BootstrapMethods - 理解invokedynamic支持
  • 344. Class文件解析 - 掌握手动解析Class文件

2.5.2 字节码指令

  • 345. 加载与存储指令 - 掌握aload、istore等
  • 346. 算术指令 - 掌握iadd、lmul等
  • 347. 类型转换指令 - 掌握i2l、d2i等
  • 348. 对象创建与访问 - 掌握new、getfield等
  • 349. 方法调用指令 - 掌握invokevirtual、invokestatic等
  • 350. 方法返回指令 - 掌握ireturn、areturn等
  • 351. 异常处理指令 - 掌握athrow和异常表
  • 352. 控制流指令 - 掌握if、goto、lookupswitch
  • 353. 栈操作指令 - 掌握pop、swap、dup
  • 354. 比较指令 - 掌握if_icmp、lcmp
  • 355. 字段操作 - 掌握getstatic、putstatic
  • 356. 数组指令 - 掌握newarray、aaload
  • 357. 同步指令 - 掌握monitorenter、monitorexit
  • 358. invokedynamic - 掌握动态方法调用
  • 359. 字节码验证 - 理解字节码验证器

2.5.3 字节码增强

  • 360. ASM框架 - 掌握字节码操作API
  • 361. ByteBuddy - 掌握运行时类生成
  • 362. CGLIB - 理解动态代理实现
  • 363. Javassist - 掌握源码级字节码操作
  • 364. Java Agent - 掌握premain和agentmain
  • 365. 热部署原理 - 理解Instrumentation.redefineClasses
  • 366. 动态类加载 - 掌握自定义ClassLoader
  • 367. ASM Core API - 掌握ClassVisitor、MethodVisitor
  • 368. ASM Tree API - 掌握树形API操作
  • 369. ByteBuddy拦截器 - 掌握@Advice注解
  • 370. 字节码注入 - 掌握性能监控注入
  • 371. AOP实现原理 - 理解字节码增强实现
  • 372. Lombok原理 - 掌握AST修改
  • 373. 热更新限制 - 理解方法签名不可变
  • 374. 字节码混淆 - 掌握ProGuard原理

2.6 类加载机制

2.6.1 类加载过程

  • 375. 加载阶段 - 理解二进制流获取和类对象创建
  • 376. 验证阶段 - 掌握文件格式、元数据、字节码验证
  • 377. 准备阶段 - 理解静态变量赋默认值
  • 378. 解析阶段 - 掌握符号引用转直接引用
  • 379. 初始化阶段 - 理解clinit执行和类初始化
  • 380. 使用和卸载阶段 - 理解类生命周期
  • 381. 主动使用 vs 被动使用 - 掌握类初始化触发条件
  • 382. 类卸载条件 - 理解所有实例回收、ClassLoader回收
  • 383. 类加载时序 - 掌握父类优先原则
  • 384. 接口加载特点 - 理解接口不触发父接口初始化
  • 385. 数组类加载 - 理解数组类由JVM直接创建

2.6.2 类加载器

  • 386. 启动类加载器 - 理解Bootstrap ClassLoader
  • 387. 扩展类加载器 - 理解Extension ClassLoader
  • 388. 应用程序类加载器 - 理解Application ClassLoader
  • 389. 双亲委派模型 - 理解委派机制和安全性
  • 390. 破坏双亲委派 - 掌握SPI机制和OSGi
  • 391. 自定义类加载器 - 掌握ClassLoader继承
  • 392. 线程上下文类加载器 - 理解Thread.getContextClassLoader
  • 393. 类加载器隔离 - 理解Web容器类加载
  • 394. 类冲突解决 - 掌握排除依赖和Shade插件
  • 395. 热部署类加载 - 理解Spring DevTools原理
  • 396. Class.forName vs loadClass - 掌握初始化差异
  • 397. 类加载器层次 - 理解父子关系
  • 398. 自定义类加载器实现 - 掌握findClass重写
  • 399. URLClassLoader - 掌握网络类加载
  • 400. 类加载异常 - 掌握ClassNotFoundException、NoClassDefFoundError

2.6.3 模块化

  • 401. JPMS (Java Platform Module System) - 理解Java 9模块化
  • 402. module-info.java - 掌握requires和exports
  • 403. 服务提供者接口 - 理解uses和provides
  • 404. 模块可见性 - 掌握opens和qualified exports
  • 405. 迁移到模块化 - 理解自动模块和未命名模块
  • 406. 模块图 - 掌握模块依赖关系
  • 407. 模块路径 vs 类路径 - 理解--module-path
  • 408. 模块化JDK - 掌握jlink定制运行时
  • 409. 反射访问限制 - 理解模块系统反射约束
  • 410. 模块服务 - 掌握ServiceLoader模块化

2.7 JVM调优实战

2.7.1 内存调优

  • 411. 堆内存设置 - 掌握-Xms、-Xmx参数
  • 412. 新生代比例 - 掌握-XX:NewRatio、-XX:SurvivorRatio
  • 413. 大页内存 - 掌握-XX:+UseLargePages
  • 414. 元空间设置 - 掌握-XX:MetaspaceSize
  • 415. 直接内存限制 - 掌握-XX:MaxDirectMemorySize
  • 416. 字符串去重 - 掌握-XX:+UseStringDeduplication
  • 417. 对象对齐 - 理解-XX:ObjectAlignmentInBytes

2.7.2 GC调优

  • 418. GC选择策略 - 掌握吞吐量vs延迟权衡
  • 419. G1调优 - 掌握-XX:G1HeapRegionSize
  • 420. ZGC调优 - 掌握-XX:ZCollectionInterval
  • 421. 软引用处理 - 掌握-XX:SoftRefLRUPolicyMSPerMB
  • 422. GC暂停分析 - 掌握安全点优化
  • 423. 内存碎片化 - 理解碎片化问题
  • 424. GC日志分析实战 - 掌握实际问题排查
  • 425. Full GC排查 - 掌握频繁Full GC解决
  • 426. GC停顿优化 - 掌握暂停时间缩短
  • 427. 吞吐量优化 - 掌握GC时间占比控制

2.7.3 性能调优案例

  • 428. 内存泄漏排查 - 掌握实战案例
  • 429. CPU飙升排查 - 掌握top+jstack定位
  • 430. 响应慢排查 - 掌握链路追踪
  • 431. 频繁GC排查 - 掌握内存分析
  • 432. 死锁排查 - 掌握jstack分析
  • 433. OOM排查 - 掌握Dump分析流程
  • 434. 启动优化 - 掌握AppCDS和CDS
  • 435. 吞吐量优化 - 掌握压测调优流程
  • 436. 延迟优化 - 掌握GC停顿优化
  • 437. 容器环境调优 - 掌握Docker内存限制
  • 438. 云环境调优 - 掌握弹性伸缩配置
  • 439. 调优方法论 - 掌握基准测试、监控、分析循环

进度统计

  • 领域:JVM与性能优化
  • 知识点总数:267项(原119项 → 现267项)
  • 已完成:0项
  • 待完成:267项

实战项目建议

  1. GC调优实战:通过JFR分析应用GC行为,调整G1参数降低停顿时间
  2. 内存泄漏排查:使用MAT分析Heap Dump,定位泄漏点
  3. 性能剖析:使用async-profiler生成火焰图,找到性能热点
  4. JVM监控:搭建Prometheus+Grafana监控JVM指标

常见面试问题

  1. JVM内存区域划分?哪些是线程共享的,哪些是线程私有的?
  2. 垃圾回收器有哪些?G1和ZGC的区别?
  3. 如何排查OOM问题?
  4. 什么是双亲委派模型?如何破坏?
  5. JIT编译的优化技术有哪些?
  6. 如何调优JVM参数?

推荐学习资源

  • 书籍:《深入理解Java虚拟机》《Java性能权威指南》
  • 工具:Arthas、JFR、MAT、JProfiler
  • 文档Oracle JVM文档
  • 视频:R大谈JVM系列、美团技术团队分享

返回总目录

知识点测试

读完文章了?来测试一下你对知识点的掌握程度吧!

评论区

使用 GitHub 账号登录后即可发表评论,支持 Markdown 格式。

如果评论系统无法加载,请确保:

  • 您的网络可以访问 GitHub
  • giscus GitHub App 已安装到仓库
  • 仓库已启用 Discussions 功能