本地方法接口和执行引擎
1.什么是本地方法
一个 Native Method 就是一个 java 调用非 java 代码的接口
该方法的底层实现由非 Java 语言实现,比如 C。这个特征并非 java 特有,很多其他的编程语言都有这一机制在定义一个 native method 时,并不提供实现体(有些像定义一个 Javainterface),因为其实现体是由非 java 语言在外面实现的。
**注意:**关键字 native 可以与其他所有的 java 标识符连用,但是 abstract 除外
2.为什么要使用本地方法(Native Method)
- 与 java 环境外交互
有时 java 应用需要与 java 外面的环境交互,这是本地方法存在的主要原因。
需要与一些其他底层系统交换信息.
本地方法就是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解 java 应用之外的繁琐细节。
- 与操作系统交互(比如线程最后要回归于操作系统线程)
JVM 支持着 java 语言本身和运行库,它是 java 程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。
他始终不是一个完整的系统,他经常依赖与一些其他底层系统
通过使用本地方法,我们得以用 java 实现了 jre 的与底层系统的交互,甚至 jvm 的一些部分就是用 C 写的。
还有,如果我们要使用一些 java语言本身没有提供封装的操作系统特性时,我们也需要使用本地方法。
3.执行引擎概述
- 执行引擎是 Java 虚拟机核心的组成部分之一。
- JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。
- 那么,如果想要让一个 Java 程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM 中的执行引擎充当了将高级语言翻译为机器语言的译者。
注意区分概念:
1.前端编译:从 Java 程序员-字节码文件的这个过程叫前端编译.
2.执行引擎这里有两种行为:一种是解释执行,一种是编译执行(这里的是后端编译)。
4.什么是解释器?什么是 JIT 编译器?
解释器:当 Java 虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。JIT(Just In Time Compiler)
编译器:就是虚拟机将源代码一次性直接编译成和本地机器平台相关的机器语言,但并不是马上执行。
5.为什么 Java 是半编译半解释型语言?
开始只是为了满足java程序实现跨平台性,因此实现解释器在运行中采用逐行解释字节码执行程序.
解释器真正的意义是’翻译者’,将字节码文件翻译为对应平台的本地机器执行命令.执行效率低.
JIT 编译器将字节码翻译成本地代码后,就可以做一个缓存操作,存储在方法区的 JIT 代码缓存中(执行效率更高了)。
JIT 编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升 Java 程序的执行性能。
一个被多次调用的方法,或者是一个方法体内部循环次数较多的循环体都可以被称之为“热点代码”。
JIT 编译器执行效率高为什么还需要解释器?
1.当程序启动后,解释器可以马上发挥作用,响应速度快,省去编译的时间,立即执行。
2.编译器要想发挥作用,把代码编译成本地代码,需要一定的执行时间,但编译为本地代码后,执行效率高。就需要采用解释器与即时编译器并存的架构来换取一个平衡点。