java程序的运行机制

java程序的运行机制

1.java的运行机制

java语言是一种特殊的高级语言,它既具有解释型语言的特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤。
java的核心机制有两个,一个是jvm虚拟机,另一个是垃圾回收机制GC。

2.高级语言的运行机制

计算机高级语言按程序的执行方式可以分为 编译型 和解释型两种。编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译(Compile),编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行。
有些程序编译结束后,还可能需要对其他编译好的目标代码进行链接,即组装两个以上的目标代码模块生成最终的可执行性程序,通过这种方式实现低层次的代码复用。
因为编译型语言是一次性地编译成机器码,所以可以脱离开发环境独立运行,而且通常运行效率较:高:但因为编译型语言的程序被编译成特定平台上的机器码,因此编译生成的可执行性程序通常无法移植到其他平台上运行;如果需要移植,则必须将源代码复制到特定平台上,针对特定平台进行修改,至少也需要采用特定平台上的编译器重新编译。
现有的C. C++, Objective-C. Swift. Kotlin等高级语言都属于编译型语言。
解释型语言是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把变异性语言中的编译和解释过程混合到一起同时完成。
可以认为:每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势:跨平台比较容易,只提供特定平台的解释器即可,每个特定平台上的解释器负责将源程序解释成 特定平台的机器指令即可。解释型语言可以方便的实现原程序的移至,但这是以牺牲程序的执行效率为代价。

3.java程序的运行机制与jVM

Java语言比较特殊,由Java语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的机器码,而是生成与平台无关的字节码(也就是class文件)。当然,这种字节码不是可执行的,必须使用Java解释器来解释执行。因此可以认为Java语言既是编译型语言,也是解释型语言。或者说,Java语言既不是纯粹的解释型语言,也不是纯粹的编译型语言。Java程序的执行过程必须经过编译,后解释两个步骤。
Java语言通过javac编辑器把java源文件,编译成字节码文件,而负责解释执行字节码文件的是JVM(Java Virtual Machine)虚拟机。JVM是可以运行Java字节码的虚拟机。所有的平台上的JVM想变一起提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能够理解的代码,然后由虚拟机执行。在一些虚拟机的实现中,还会将一些虚拟机代码转换成特定系统的机器码执行,从而提高效率。
1.javac程序是一个Java编译器。它将文件HelloWorld.java编译成HelloWorld.class文件,并发送到java虚拟机。虚拟机执行编译器放在class文件中的字节码。

(1.)JVM 加载 class 文件的原理机制

jdk

2.JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是 一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。
由于 Java 的跨平台性,经过编译的 Java 源程序并不是一个可执行程序,而是一个或多个类文件。 当 Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、连接(验证、准备和解析)和 初始化。
3.的加载是指把类的.class 文件中的数据读入到内存中,通常是创建一个字节数组读 入.class 文件,然后产生与所加载类对应的 Class 对象。加载完成后,Class 对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分 配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后 JVM 对类 进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类; 2)如果类中存在初始化语句,就依次执行这些初始化语句。

类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、 系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader 的子类)。从 Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM 更好的保证了 Java 平台的安全性, 在该机制中,JVM 自带的 Bootstrap 是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM 不会向 Java 程序提供对 Bootstrap 的引用。

下面是关于几个类加载器的说明:

Bootstrap:一般用本地代码实现,负责加载 JVM 基础核心类库(rt.jar);
Extension:从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap;

System:又叫应用类加载器,其父类是 Extension。它是应用最广泛的类加载器。它从环境变量 classpath 或者系统属性 java.class.path 所指定的目录中记载类,是用户自定义加载 器的默认父加载器。

4.Java运行机制(一次编码,一次解析,两次编译)和优化技术

Java代码从编译到运行的过程是这样的:

(1)开发期,编码阶段,编写Java源码

(2)编译期—Javac第一次编译,通过Javac编译器编译成.class文件(字节码文件),

(3)编译期—JVM解析,通过JVM内嵌的解释器(类加载器)解析.class文件

(4)编译期—JVM第二次编译,

① JIT编译器(即时编译器),把经常运行的代码作为热点代码,编译成与平台相关的机器码,并进行各种层次优化

② AOT编译器,直接将所有代码编译成平台相关的机器码

(5)运行期,运行机器码文件

Java优化技术:JIT和AOT,若JVM加载.Class文件后,直接解释执行,势必会影响效率;
JVM提供了两种编译器,用于编译执行:
JIT优化技术,将常用的代码编译成机器码

AOT优化技术,在运行前,通过工具直接将字节码转换成机器码

所以目前主流的JDK8版本,Java执行模式其实是** 解释-编译 **的混合模式(-Xmixed)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值