Java工程师知识树 / Java基础
什么是JVM
JVM定义
JVM(Java Virtual Machine)意思是Java虚拟机。它是一个虚拟出来的计算机,可在实际的计算机上虚拟各种计算机功能。JVM有自己完善的硬件架构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。
JVM作用
JVM是Java字节码执行的引擎,为Java程序的执行必要的执行,它还能优化Java字节码,使之转换成效率更高的机器指令。
程序员编写的程序最终都要在JVM上执行,JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的。ClassLoader是Java运行时一个重要的系统组件,负责在运行时查找和装入类文件的类。
JVM屏蔽了与具体操作系统平台相关的信息,从而实现了Java程序只需生成在JVM上运行的字节码文件(class文件),就可以在多种平台上不加修改地运行。不同平台对应着不同的JVM,在执行字节码时,JVM负责将每一条要执行的字节码送给解释器,解释器再将其翻译成特定平台环境的机器指令并执行。Java语言最重要的特点就是跨平台运行,使用JVM就是为了支持与操作系统无关,实现跨平台运行。
Java跨平台
Java是一门跨平台语言,所谓跨平台就是,Java源文件会被编译成为字节码文件,不管是Windows,Linux还是Mac,都有其适配的JVM,也就是字节码文件可以随意在这些JVM上去运行。
JVM跨语言
JVM种类
三种JVM
- Sun公司
Java HotSpot(TM) 64-Bit Server VM
- BEA
JRockit
- IBM
J9 VM
cmd命令java -version
查询
解释器和编译器
HotSpot JVM包括一个解释器和两个编译器,解释与编译混合执行模式,默认启动解释执行。
编译器:java源代码被编译器编译成class文件(字节码),java字节码在运行时可以被动态编译(JIT)成本地代码
解释器:解释器用来解释class文件(字节码)
Java代码编译是由Java源码编译器来完成,流程图如下所示:
Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:
JVM程序执行步骤
JVM在整个JDK中处于最底层,负责与操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也称为虚拟计算器。操作系统装入JVM是通过JDK中的java.exe来实现,主要通过以下几个步骤完成。
- 创建JVM装载环境和配置。
- 装载jvm.dll。
- 初始化jvm.dll。
- 调用JNIEnv实例装载并处理class类。
- 运行Java程序。
JDK/JRE/JVM的区别
JRE包含JVM和一些java API;
JDK包含JRE和一些java开发工具和监控工具;
JVM实例的生命周期
JVM的生命周期:
(1)JVM实例的诞生
当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点
(2)JVM实例的运行
main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程
(3)JVM实例的消亡
当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用java.lang.Runtime类或者java.lang.System.exit()来退出。
工作中常见的JVM相关问题:
- 运行系统卡死,系统无法访问,直接 OOM 。
- 线上 GC (垃圾回收)导致CPU飙升,需要 dump 内存快照,并进行分析。
- 新项目上线,需要对系统进行评估,设置 JVM 的参数。
- 实际项目中 JVM 参数调优。