1 JVM简介
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机JVM后,Java语言在不同平台上运行时不需要重新编译。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行,因此屏蔽了与具体平台(win、mac)相关的信息,使得只需要一份字节码文件,就可以在多种平台上不加修改地运行。
不仅如此,现在的JVM还实现了语言的无关性,Scala、Kotlin、Groovy等语言都可以使用JVM运行。
编译后被Java虚拟机所执行的代码使用了一种平台中立(不依赖于特定硬件及操作系统)的二进制格式来表示, 并且经常(但并非绝对)以文件的形式存储, 因此这种格式称为class 文件格式。 实际上JVM的平台、语言无关性的上层原因也是因为.class文件格式的平台、语言无关性。
2 JVM的生命周期
2.1 启动
JVM实例对应了一个独立运行的java程序,它是进程级别。
启动一个Java程序时,会首先建立一个JVM实例,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点
2.2 运行
main()作为该程序初始线程的起点,任何其他线程均由该线程启动。
JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程(Thread的setDaemon(true)方法)。
2.3 消亡
当程序中的所有非守护线程都终止时,JVM退出;
若安全管理器允许,程序也可以使用System.exit(0)或 Runtime.getRuntime().exit()来退出。
程序所在平台强制结束JVM进程
3 JVM的体系结构
3.1 JVM组成
主要分成三块:
类装载器(ClassLoader)(用来装载.class文件)
执行引擎(执行字节码,或者执行本地方法)
运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)
注意:java编译器把java源文件(.java文件)编译成字节码文件(.class文件),然后JVM对字节码文件进行加载、解释执行。java的源代码是无法直接在JVM上运行的,Java编译器在JDK中,可以使用javac命令对Java源文件进行编译。
3.1 JVM各模块简介
我们的后续学习主要学习的内容是JVM的类加载机制、运行时数据区域、GC机制、执行引擎机制、以及一些JVM优化。
对于源文件的编译,并不属于JVM的范畴,编译原理的内容比较复杂,但是我们可以了解一下,Java源代码编译大概步骤为:
生成的字节码文件中包含结构信息、元数据、方法信息等,具体的字节码结构在类文件结构部分。深入了解编译器可以看《自己动手实现JVM》、《编译原理》等书。
JVM对Java字节码进行加载、执行,JVM的类加载是通过ClassLoader及其子类来完成的,执行的过程抽象如下:
参考资料:
R大博客
Java代码编译和执行的整个过程
如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!