JVM为什么称为机器
抽象(Abstraction)
计算机重要的思想就是抽象,抽象的思想贯穿于整个计算机世界(包括计算机底层及业务代码)。了解抽象的概念对计算机思维的培养大有裨益。那什么是抽象:
- 抽象就是忽略一个主题中与当前问题(或目标)无关的那些方面,以便充分的注意与当前问题(或目标)有关的方面。
- 抽象是从众多的事物中抽取共同的、本质性的特征。舍弃其非本质的特征。
- 抽象是一种从个体把握一般,从现象把握本质的认知过程和思维方法。
如上图:I/O设备是对文件的抽象(linux的世界中一切皆文件);虚拟内存是对存储器的抽象(解决了不同进程抢占内存问题);指令集架构是对处理器的抽象;进程是对处理器、主存和IO设备的抽象(进程=资源+指令执行序列);虚拟机是对整个计算机的抽象(包括操作系统和进程)。
类比于虚拟机的抽象: - 封装了一组自定义的字节码指令集,程序计数器和执行引擎(对应于指令集架构),可以执行运算指令;
- 有类似操作系统的程序装载与运行机制、内存管理机制、线程以及栈管理机制。
jvm的位置
JAVA应用程序运行在JRE之上的,JRE包含JVM,JVM是在操作系统之上的,JVM本质上也是运行在操作系统的应用程序。
如上图:java应用程序运行在jvm之上,jvm运行在操作系统之上,操作系统可以是linux、windows等。jvm屏蔽了操作系统的不同,根据不同的操作系统有不同的字节码解析,这就是java实现跨平台(一次编译,到处运行)的原因。目前微软的.net core也实现了跨平台,思想主要就是应用到了中间语言(IL),区别于java的字节码。
jvm启动
JDK:它是功能齐全的Java SDK,拥有JRE所拥有的一切,它还有编译器(javac)和工具。能够创建和编译程序。
JRE:是Java运行时环境,是运行已编译Java程序所需的所有内容的集合,包括JVM,Java类库等。但它不能用于创建程序。
JVM的启动需要先按照JDK(一般安装JDK后包含JRE)
jvm创建过程如图:
java main()如何被执行:在虚拟机初始化的过程中,将创建并启动Java的main线程,最后调用JNIEnv的CallStaticVoidMethod()来执行main方法。
jvm体系结构
类加载器
Java类加载器是Java运行时环境(JRE)的一部分,负责动态加载(按需加载)Java类到Java虚拟机的内存空间。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。
Java中的类加载器,大致可以分为两类,一类是由系统提供的,另外一类则是由开发编写的。
- BootStrap:引导加载器,加载最基础的文件。
- ExtClassLoader:扩展加载器,加载都是基础文件。
- AppClassLoader:应用加载器,三方jar包和自己编写的。
类的加载过程:
加载(类加载器)
准备
public class loadTestClass{
public static void main(){
StudentManager student=new StudentManager();
}
}
public class StudentManager{
public static int accademicYear=Configuration.getYear("year");
}
如上代码:编译后的字节码 loadTestClass.class和StudentManager.class会被加载(含有main函数);
类的加载过程中,准备阶段StudentManager中的accademicYear会被分配内存空间,并赋值0。
初始化
如上代码,在初始化阶段,会读取配置文件中的值
小结
jvm是java程序运行的基石,学好jvm对能更好的理解java程序是如何运行起来的。接下来将会继续陪跑学习jvm的运行时数据区和内存模型。