“这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战”
💗引言
关于JVM已经出了12篇文章,但是我在今天的时候,突然就想问一问自己,对于JVM的基础知识是否真的掌握了❔是否真的学懂了❔于是,就有了这篇扩展专题的撰写,先停下来看看基础是否扎实,如果扎实了,再冲锋,不扎实,就等扎实了,再冲锋,扩展篇作为一篇总结篇,由于工作原因更新频率为每周一篇,本文参考自宋老师的公开课《JVM从入门到精通》、书《精通java虚拟机》、规范《java虚拟机规范》。
💗问题
- 什么是虚拟机,虚拟机的分类以及
java虚拟机的位置❔ - 除了
hotspot你还知道哪些虚拟机嘛❔ - 内存结构❔
- 等等
💗虚拟机与java虚拟机
虚拟机(VM)说白了就是我们的应用程序,只不过它可以像我们的计算机一样执行虚拟计算机的指令,大体上我们可以把虚拟机分成两大类:程序虚拟机和系统虚拟机。需要说明的是:无论是物理虚拟机还是程序虚拟机,在虚拟机上运行的软件资源都要受到虚拟机本身的限制。
💚程序虚拟机
顾名思义,就是执行我们java程序的虚拟机,典型的代表就是java虚拟机,由于是程序虚拟机,故其运行在操作系统之上。
💙java虚拟机
java虚拟机是执行java字节码的虚拟机,在虚拟机中执行的指令我们称之为java字节码指令。但需要注意的是虽然是执行java字节码的,但是其并不一定是java语言编译生成的,因为它具有语言的跨平台性,只要你符合这个规范,那都可以被java虚拟机执行。
💚系统虚拟机
顾名思义,就是为我们的系统提供一个操作平台的,模拟的是物理计算机。
💗java虚拟机
💚java的整体执行流程
java虚拟机的执行流程如下所示:java虚拟机是操作我们的字节码的也就是我们的.class文件,那字节码是哪来的呢?是通过编译器编译命令javac来的,通过javac将我们的源代码(原料)编译成字节码(加工用料),往上是明白了,那往下呢?往下就进入到我们的大车间(类装载器子系统),将我们的加工用料整成一个个的对象,使他们活动在我们的运行时的数据区(用来数据交换、数据整合等等),整个数据区又被一个大的执行引擎驱动着,执行引擎分为三个部分:解释器、JIT编译器、垃圾回收。为啥要有执行引擎呢?因为我们的字节码并不是真正的机器指令,那就需要解释器的参与,由于解释器的效率并不是很高,对于一些热点代码我们就引入了即时编译器。所以整个过程需要执行引擎参与执行,翻译成机器指令后就直接交给操作系统处理,然后由操作系统处理我们的硬件完成我们想要的功能实现。
💚 JVM的架构模型
市面上存在这两种架构模型,一种是基于栈的,一种是基于寄存器的,那我们的hotspot采用的就是基于栈的指令集架构,这种架构设计和实现起来比较简单,适用于受限的系统,而且呢扩展性更好,不需要硬件的支持,同时栈的指令集小更易于编译器的实现,缺点是指令多,执行起来的性能比基于寄存器的差,洒洒水啦🌀~,这个没办法都做得完美的。
💚JVM的生命周期
💙启动
《java虚拟机规范》定义了java虚拟机的启动是通过引导类加载器,创建一个初始类完成的,这个出初始类的指定由具体的Java虚拟机进行实现。 Java 虚拟机然后链接初始类,初始化它,并调用公共类方法 void main(String[])。调用此方法会驱动所有方法进一步的执行,原文如下图:
💙执行
执行就比较简单了,就是执行java程序,但java程序说白了也是虚拟机执行里面的一个进程,同时虚拟机伴随程序的结束而结束。进程的查看呢,我们可以通过jps指令来查看,后续我们会介绍一系列好玩的指令,先按下不表。
💙退出
虚拟机的退出(了解)也是我们程序的退出,有这么几个情况:
- 我们最期待的正常退出
- 我们常见的异常退出
- 少见的因为操作系统异常退出
- 当某个线程调用类
Runtime或类System的exit方法,或类Runtime的halt方法,且exit或halt操作被安全管理器允许时,Java虚拟机就会退出。 - 此外,JNI(
Java Native Interface)规范描述了在使用JNI Invocation API加载和卸载Java虚拟机时的终止。
💚JVM发展历程
这些主流的虚拟机,你知道嘛?感兴趣的同学可以点击这个链接
💚类加载过程
这里就不多介绍了,感兴趣的同学可以点击这个链接
💚内存结构
这里就不多介绍了,感兴趣的同学可以点击这个链接
💗题外话
千万不要做名为付出,实为索取的事,要做到实为付出,实为索取,做到书读百遍,其义自见,书读千遍,万法呈现。要脚踏实地,实事求是,只有追求真理的道路才是快乐的,才是实的台阶,才能一步一步走向光明大道。