返回 随笔记录
二、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项
实战项目建议
- GC调优实战:通过JFR分析应用GC行为,调整G1参数降低停顿时间
- 内存泄漏排查:使用MAT分析Heap Dump,定位泄漏点
- 性能剖析:使用async-profiler生成火焰图,找到性能热点
- JVM监控:搭建Prometheus+Grafana监控JVM指标
常见面试问题
- JVM内存区域划分?哪些是线程共享的,哪些是线程私有的?
- 垃圾回收器有哪些?G1和ZGC的区别?
- 如何排查OOM问题?
- 什么是双亲委派模型?如何破坏?
- JIT编译的优化技术有哪些?
- 如何调优JVM参数?
推荐学习资源
- 书籍:《深入理解Java虚拟机》《Java性能权威指南》
- 工具:Arthas、JFR、MAT、JProfiler
- 文档:Oracle JVM文档
- 视频:R大谈JVM系列、美团技术团队分享
知识点测试
读完文章了?来测试一下你对知识点的掌握程度吧!
评论区
使用 GitHub 账号登录后即可发表评论,支持 Markdown 格式。
如果评论系统无法加载,请确保:
- 您的网络可以访问 GitHub
- giscus GitHub App 已安装到仓库
- 仓库已启用 Discussions 功能