先附上之前画的JVM全景架构图。
时光荏苒,时间一点一点地流逝,不知不觉中半载光阴便稍纵即逝,犹如白驹过隙。继之前的《并发编程系列》后,JVM系列的文章至此也画上了句号,与《并发编程》系列相同,列出总纲目录方便诸位翻阅。
在刚接触Java虚拟机时,JVM的一些常识认知,HotSpot
虚拟机的“前世今生”以及Java虚拟机发展史上的一些趣事,作为了《JVM系列》的开篇:
紧接着,作为Java代码入口的类加载子系统出现在了我们的视野中,本篇中对于虚拟机的类加载机制,从类加载过程、类加载器、双亲委派模型、自定义类加载器以及打破双亲委派等多方面进行全面阐述:
Java源码编译后生成.class
字节码文件,经类加载子系统载入内存后,究竟是如何被JVM执行的,这其中的神秘之处难免会令人好奇。因此,第三篇中则对于Java虚拟机的执行引擎子系统,从探讨机器指令、汇编、高级语言的关系出发,到.java
文件的源码编译过程、解释器执行过程、热点探测机制、JIT即时编译原理以及分派调用实现等多方面,深入分析了JVM的执行子系统:
一转眼,来到了JVM体系中被谈及最多的内容,也就是JVM运行时数据区,在该章中对虚拟机运行时的各个数据区、内存溢出OOM
及内存泄漏问题进行了全方位的阐述:
上章中分析了JVM运行时的各个数据区域,接着对Java应用中最重要的部分:Java对象进行了详细剖析,从一个对象的内存布局、对象分配过程、“生至死”历程、强弱软虚引用类型等多维度出发,对Java对象进行逐步拆解,从而让“对象”在我们面前再无秘密可言:
清楚了JVM内存区域,剖析了Java对象之后,转场来到了Java虚拟机中的另外一个核心:GC垃圾收集子系统。但由于GC方面的内容颇多,因此拆解成了三篇分别论述,基础篇中主要阐述了:对象存活判定算法、垃圾回收算法、STW世界暂停、GC类型划分、安全点与安全区域等GC基础内容:
在《基础篇》中详细了解了GC相关的基础知识后,《分代篇》中则对《基础篇》中的算法思想进行了落地实现,其中主要内容涵盖(新生代、年老代、串行、并行、并发)收集器、三色标记算法、记忆集-卡表实现、GC执行过程、GC日志解读,从多个维度拆解了JVM虚拟机中的六款分代垃圾收集器:
《分代篇》中主要谈及JDK8及之前分代GC框架下的六款垃圾收集器,但后续新版本的JDK中,自G1
起,涌现了一批不分代类型的高性能分区收集器。因此,在《分区篇》中则深入剖析了G1、ZGC、ShenandoahGC
三款高性能收集器,自此后,“GC家族”凑齐十款垃圾收集器:
前八个章节中更多的是处于原理剖析阶段,基于JVM中的核心点,在理论层次进行高谈阔论,但实操内容并未提及。因而,第九章以JVM参数拉开了实战序幕:
拥有了完善的理论基础后,JVM线上实战实操必然也不能缺席,因此《线上排查篇》它来了!从线上排查思路、JDK监控工具开始,到OOM
问题、内存泄漏问题、线程死锁问题、应用宕机问题、响应缓慢问题等多个线上灾难故障的排查实操,进行了全面实战:
性能调优是一个如今炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个老生常谈的话题,因此最后一章中,从系统性能优化的核心思维,到垃圾收集器相关的调优策略,再到阿里在线排查Arthas
工具排查各问题,最后到不同场景下的JVM最佳配置推荐,进行了全面解读:
至此,JVM系列的文章还缺少了字节码方面以及一些冷门的内容没去分析,但就目前为止先暂且画上句号,后续诸君有需求再来补齐~
上述的《JVM系列》文中所有内容掌握后,不一定能让大家精通JVM,但至少能为各位构建出全面的JVM理论知识 + 实战体系!
如果你认为文章对于你有帮助,收藏的同时,也可以多多点赞、关注支持!
下期预告:《程序员的网络编程秘籍》或《漫谈分布式架构》。