目录
一、前言
1. 目的
学习一个技术最先开始了解的应该是它的目的,它会给我们带来什么?
作为Java选手,你是否遇到以下问题?
- 运行着的线上系统突然卡死崩溃,甚至直接出现OOM;
- 对于线上JVM GC问题,无从下手;
- 对于新项目是否一股脑的选择G1垃圾收集器,采用默认的JVM参数;
- 面试期间,面试官问如何解决OOM、GC问题,阁下又该如何应对?
掌握JVM可以进行系统性能调优,排除线上bug。(当然还可以很好的应付面试)
2. 位置
JVM在整个计算机系统中所处位置:
我们知道高级编程语言,要在计算机上运行,需要将先将其转换为字节码文件,然后通过JVM解释/编译为平台的机器指令执行。
二、编程语言热度排行榜
TIOBE官网:https://www.tiobe.com/tiobe.index/
其实2020年之前,Java是稳居第一第二的位置,主要是Java的生态圈太完善了,它不仅仅是一门编程语言,已经演变成了一种文化。
三、Java的跨平台性
一次编译,随处运行。
四、JVM跨语言的平台
所以说:Java不是最强大的编程语言,但是JVM一定是最强大的虚拟机。
任何一门编程语言,在遵循字节码文件规范后,都可以被JVM解释运行。
五、JVM的整体结构
后续所有章节也都是围绕着这几部分展开:类加载器子系统、运行时数据区、执行引擎。
六、Java代码的执行流程
七、JVM的结构模型
Java编译器输入的指令流的架构类型主要有以下两种:
- 基于栈式的指令集架构的特点:
- 设计和实现更简单,适用于资源受限的系统;
- 避开了寄存器的分配难题:使用零地址指令方式分配。(零地址指令是没有地址只有操作数,一地址指令是比如3为操作数,2为他的地址只有一个地址,二地址指令就是一个操作数两个地址)因为栈只需要执行入栈出栈操作,只对栈顶数据进行操作所以不需要地址。
- 不需要硬件支持,可移植性更好,更好地实现跨平台。
- 执行性能比寄存器差。
2. 基于寄存器架构的特点
缺点:指令集架构完全依赖于硬件,可移植性差。
优点:1. 性能优秀,效率高。(因为他是直接在缓冲区中运行)2.花费更少的指令完成操作。
Hotspot虚拟机其实基于栈的操作,Java也是每执行一个方法就相当于将方法压入栈,执行完之后就将其弹出。
下面通过代码演示一下,基于栈式的指令集架构的特点:
指令是八位的。
加载到内存中,字节码文件如何生成相应的指令,进行字节码反编译
其实直接在编译阶段将2+3变成了5,存储到istore_1(1是栈的索引位置)中
针对这种情况重新进行编译:
基于寄存器的指令流:
mov eax,2 //将eax寄存器的值设为1
add eax,3 //使eax寄存器的值加3
八、JVM的生命周期
九、JVM参考书籍
官方推荐:
个人比较推荐《深入理解Java虚拟机》这本书,但是建议搭配着视频一起品尝,否则可能会比较枯燥难懂。(需要电子版可以评论区留言)
参考:
1. b站:尚硅谷宋红康JVM全套教程(详解java虚拟机)01-JVM内存与垃圾回收篇概述_哔哩哔哩_bilibili
2. 第一章 JVM和Java体系架构_https://blog.csdn.net/sj15814963053/article/detail-CSDN博客