什么是Java虚拟机(JVM)
什么是 JVM ?
了解什么是JVM之前先简单说下什么是Java ?, 啥是Java很难用一句话来概括,我们从四个方面来阐述 .
- 通过JVM实现跨平台
1. 简单说就是Java的代码编译好之后,是跑在一台虚拟的机器上的,并且负责分配内存和维护调用堆栈。
2. 为什么要做成虚拟的机器这要从Java的一次编译到处执行来说。事实上一次编译到处执行是不可能的,因为每个机器不一样,所以传统上我们必须针对每一种机器编译代码,才能在这个机器上运行。而Java通过引入虚拟机(VM)的概念,让编译后的代码直接跑在一台虚拟的机器上,无论最终的目标平台是什么,都在上面构建出一个虚拟的一致的虚拟机出来,就可以达到一次编译到处执行的效果了。
- JVM的总体结构
JVM 由 三个主要部件构成 :
① 类加载器 ② 运行时数据区 ③ 执行引擎
(1) 类加载器 [ClassLoader] :
它负责在运行时查找和装入类文件的类 , JVM里有多个类加载器 , 每个类加载器负责加载特定位置的类.(如下图:) 例如
引导类加载器(bootstrap) : 负责加载 jre/lib/rt.jar 中的类
扩展类加载器(extclassloader) : 负责加载 jre/lib/ext/*.jar 中的类
系统类加载器(appclassloader) :开发人员自己编写的类
(2) 运行时数据区
运行时数据区分为五个区域
方法区和堆区是一个公共区域
虚拟机栈、本地方法栈、程序计数器是每个线程专有的私有区域
方法区:它存放一些加载后的类信息(有类的版本、字段、方法、接口等描述信息)、常量、静态变量等信息.
堆区:在JVM启动时创建 , 它存放对象实例,几乎所有的对象实例都在这里分配内存, 这块区域也是 GC(垃圾回收机制) 重点清理的区域 。
虚拟机栈:每一线程都会在这个区域创建一个栈, 当执行一个方法时会创建一个栈帧 , 栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息 , 基本变量和对象的引用变量都存放于此.栈中执行顺序是 “后入先出(LIFO)”
程序计数器 : 它存储或说记录当前线程之前执行的任务状态,等线程抢到CPU时间片时,继续未完成的任务.[也称为PC寄存器]
本地方法栈: == 用于JNT调用等 ,.JNI技术,java调用c语言等其它语言开发的函数 == ,本地方法栈中也会抛出StackOverflowError 和 OutOfMemory异常.该区域不受 GC 所管制.
(3) 执行引擎 [Runtime Data Area] : (如上图所示) 执行引擎 将字节码分配给运行时数据区 , 执行引擎读取字节码并逐段执行.其中图中的
本地接口 (JNI): JNI 会与本地方法库进行交互并提供执行引擎所需的本地库。
本地方法库:它是一个执行引擎所需的本地库的集合。
- 总结
跨平台方面:
在不同操作平台上,jvm充当了一个翻译官的角色,也使java 有跨平台这个特性.也对应了他的口号==“一次编译,到处执行”==
结构方面:
对各个区域的作用以及流程都进行了一番梳理、