这是我见过最好的 JVM 笔记,拿到阿里 offer 后我哭了
面试经常被问 JVM 如何调优?这个问题该怎么回答?没有实际调优经验怎么办?
一般面试时问 JVM 调优,主要是因为,这个技术并不是懂了 Java 就能自然懂的,需要明白一些底层原理,有一些深度。所以比较适合用来查看面试者是不是足够“高级”。
那么面试时,如何回答 JVM 调优?主要需要你能回答两方面的问题:
如何观察 JVM 的运行参数。比如你发现 Java 程序跑得慢,定期卡顿,OOM 挂掉。为了找原因,你必须学会怎么去看 JVM 到底是怎么运行的。这时需要你了解一些 JVM 自带的工具命令,比如 jps、jstack、jhat,还有比较新的 Java 自带的 JMC 图形界面工具。通过他们你可以了解到一个 Java 进程有多少线程,每个线程什么状态,是不是在等着锁:进程的 CPU 和内存占用了多少;GC 状态怎么样,Full GC 频繁不频繁等等;内存中是不是有泄露,哪个地方可能泄漏了等等。
如何给出方案。你要明白 JVM 的工作原理,根据运行参数解决你的问题。比如你发现程序启动慢,你可能猜测有可能是代码没写好,就是跑得慢;也许是一开始 load 资源过大,而 heap 不大,造成反复 Full GC。你必须通过运行参数来印证你的猜想,然后有针对性地去解决那些问题。为此,你需要大致明白多线程的工作原理,Java 内存管理,GC 的工作原理(串行、CMS 和 G1)等。
JVM 高级特性与最佳实践
限于文章篇幅原因,只能以截图的形式展示出来,有需要的小伙伴 点击这里凭本文截图即可获取!
目录详解
内容概览
第一部分 走近 Java
本书的第一部分为后文的研究和讲解建立 了良好的基础。虽然了解 Java 技术的来龙去脉,以及编译自己的 OpenJDK 对于读者理解 Java 虚拟机并不是必须的,但是这些准备过程可以为走近 Java 技术和 Java 虚拟机提供良好的引导。
第 1 章 介绍了 Java 技术体系过去、现在的情况以及未来的发展趋势,并在实践中介绍了如何自己编译一个 OpenJDK 12。
第二部分 自动内存管理
因为程序员把控制内存的权力交给了 Java 虚拟机,所以可以在编码的时候享受自动内存管理的诸多优势,不过也正因为这个原因,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将会成为一项异常艰难的工作。
第 2 章 介绍了虚拟机中内存是如何划分的,哪部分区域、什么样的代码和操作可能导致内存溢出异常,并讲解了各个区域出现内存溢出异常的常见原因。
第 3 章 介绍了 垃圾收集的算法和 HotSpot 虚拟机中提供的几款垃圾收集器的特点及运作原理。通过代码实例验证了 Java 虚拟机中自动内存分配及回收的主要规则。
第 4 章 介绍了随 JDK 发布的基础命令行工具与可视化的故障处理工具的使用方法。
第 5 章 分享了 几个比较有代表性的实际案例,还准备了一个所有开发人员都能"亲身实战”的练习,希望读者能通过实践来获得故障处理和调优的经验。
第三部分 虚拟机执行子系统
执行子系统是虚拟机中必不可少的组成部分,了解了虚拟机如何执行程序,才能更好地理解怎样才能写出优秀的代码。
第 6 章 讲解了 Class 文件结构中的各个组成部分,以及每个部分的定义、数据结构和使用方法,以实战的方式演示了 Class 的数据是如何存储和访问的。
第 7 章 介绍了类加载过程的“加载"“验证” "准备" "解析” 和“初始化"五个阶段中虚拟机分别进行了哪些动作,还介绍了类加载器的工作原理及其对虚拟机的意义。
第 8 章 分析了虚拟机在执行代码时,如何找到正确的方法、如何执行方法内的字节码,以及执行代码时涉及的内存结构。
第 9 章 通过几个类加载及执行子系统的案例,介绍了使用类加载器和处理字节码的一些值得欣赏和借鉴的思路,并通过一个实战练习加深读者对前面理论知识的理解。
第四部分 程序编译与代码优化
Java 程序从源码编译成字节码,再从字节码编译成本地机器码的这两个过程,从整体来看其实等同于一个传统编译器所执行的编译前端、后端过程。
第 10 章 分析了 Java 语言中泛型、主动装箱拆箱、条件编译等多种语法糖的前因后果,并实战练习了如何使用插入式注解处理器来完成一个检查程序命名规范的编译器插件。
第 11 章 讲解了虚拟机的热点探测方法、HotSpot 的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析即时编译的数据和结果,还选择了几种常见的编译器优化技术进行讲解。
第五部分 高效并发
Java 语言和虚拟机提供了原生的、完善的多线程支持,使得它天生就适合开发多线程并发的应用程序。不过我们不能期望系统来完成所有与并发相关的处理,了解并发的内幕也是成为一-位高级程序员不可缺少的课程。
第 12 章 讲解了虚拟机 Java 内存模型的结构及操作,以及原子性、可见性和有序性在 Java 内存模型中的体现;介绍了先行发生原则的规则及使用,以及线程在 Java 语言之中是如何实现的;还提前介绍了目前仍然在实验室状态的 Java 协程的相关内容。
第 13 章 介绍了线程安全所涉及的概念和分类、同步实现的方式及虚拟机的底层运作原理,并且介绍了虚拟机实现高效并发所做的一系列锁优化措施。
限于文章篇幅原因,就展示到这里了,有需要的小伙伴 点击这里凭本文截图即可获取!
最后
前不久有朋友面试了阿里,面试官问到:关于 Dalvik 虚拟机能不能执行 class 文件
他当时的回答是:不能,但是它执行的是 class 转换的 dex 文件。
当面试官继续问:为什么不能执行 class 文件?
他的回答只有:Dalvik 虚拟机内部的优化原因,没能给出正确回答具体的原因。
其实上面分享的这份笔记就有回答:Dakvik 并不是一个 Java 虚拟机,它没有遵循 Java 虚拟机规范,不能执行 Java 的 class 文件,使用的是寄存器架构而不是 JVM 中常见的栈架构,但是它与 Java 又有着千丝万缕的关系,它执行的 dex 文件可以通过 class 文件转化而来
评论