一、java代码编译执行过程
- 源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件)
- 类加载:通过ClassLoader及其子类来完成JVM的类加载
- 类执行:字节码被装入内存,进入JVM虚拟机,被解释器解释执行
注:Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,
用Java语言编写并编译的程序可以运行在这个平台上
二、JVM简介
-
java程序经过一次编译之后,将java代码编译为字节码也就是class文件,然后在不同的操作系统上依靠不同的java虚拟机进行解释,最后再转换为不同平台的机器码,最终得到执行
-
Java虚拟机(JVM) 处在核心的位置,是程序与底层操作系统、硬件无关的关键。
- JVM的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台的部分称为适配器,JVM 通过移植接口在具体的平台和操作系统上实现
- JVM 的上方是Java的基本类库和扩展类库以及它们的API, 利用Java API编写的应用程序(application) 和小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台
- Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java 的跨平台
-
JVM在它的生存周期中有一个明确的任务,那就是运行Java程序,因此当Java程序启动的时候,就产生JVM的一个实例;当程序运行结束的时候,该实例也跟着消失了
-
三种JVM:① Sun公司的HotSpot ② BEA公司的JRockit ③ IBM公司的J9 JVM
- 在JDK1.7及其以前我们所使用的都是Sun公司的HotSpot,但由于Sun公司和BEA公司都被oracle收购,jdk1.8将采用Sun公司的HotSpot和BEA公司的JRockit两个JVM中精华形成jdk1.8的JVM。
三、JVM体系结构
- Class Loader类加载器
负责加载 .class文件,class文件在文件开头有特定的文件标示,并且ClassLoader负责class文件的加载等,至于它是否可以运行,则由Execution Engine决定。
① 定位和导入二进制class文件
② 验证导入类的正确性
③ 为类分配初始化内存
④ 帮助解析符号引用. - Native Interface本地接口
本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序,Java诞生的时候C/C++横行的时候,要想立足,必须有调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为
native的代码,它的具体作法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies。
目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机,或者Java系统管理生产设备,在企业级应用中已经比较少见。
因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用Web Service等。 - Execution Engine 执行引擎:执行包在装载类的方法中的指令,也就是方法。
- Runtime data area 运行数据区(即:虚拟机内存或者JVM内存 下节