本地方法接口、执行引擎
一、本地方法接口
1、 什么是本地方法
简单来讲,一个 Native Method 就是一个 java 调用非 java 代码的接口,一个 Native Method 是这样一个java 方法:该方法的底层实现由非 Java 语言实现, 比如 C。这个特征并非 java 特有,很多其他的编程语言都有这一机制在定义一个 native method 时,并不提供实现体(有些像定义一个 Java interface),因为其实现体是由非 java 语言在外面实现的。
关键字 native 可以与其他所有的 java 标识符连用,但是 abstract 除外。
2、为什么要使用Native Method?
Java 使用起来非常方便,然而有些层次的任务用 java 实现起来不容易,或者我 们对程序的效率很在意时,问题就来了。
1.与 java 环境外交互:
有时 java 应用需要与 java 外面的环境交互,这是本地方法存在的主要原因。 你 可以想想 java 需要与一些底层系统,如某些硬件交换信息时的情况。本地方法 正式这样的一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需 去了解 java 应用之外的繁琐细节。
2.Sun’s Java
Sun 的解释器是用 C 实现的,这使得它能像一些普通的 C 一样与外部交互。jre 大部分是用 java 实现的,它也通过一些本地方法与外界交互。例如:类 java.lang.Thread 的 setPriority()方法是用 Java 实现的,但是它实现调用的是该类里的本地方法 setPriority0()。
总结:
什么是本地方法?
一个 Native Method 就是一个 java 调用非 java 代码的接口
非java语言实现的,例如 C /C++
为什么要使用 Native Method
我们的java程序 需要与外部(计算机硬件)进行数据交互( 例如hashCode read() start() )
可以直接调用外部 的本地方法实现.
JVM解释是用C写的,可以更好的与本地方法交互.
二、执行引擎
1、概述
1、执行引擎是Java虚拟机核心的组成部分之一。
2、JVM的主要任务是负责装载字节码到其内部,但字节码并不能直接运行在操作系统上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息。
3、那么,如果想要让一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
注意区分概念:
(1)前端编译:从Java程序–>字节码文件的这个过程叫前端编译( .java —> .class)。
(2)执行引擎这里有两种行为:一种是解释执行,一种是编译执行(这里的是后端编译)。后端编译(.class —> 机器码)
2、什么是解释器?什么是JIT编译器?
解释器: 当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
JIT(Just In Time Compiler)编译器: 就是虚拟机将源代码一次性直接编译成和本地机器平台相关的机器语言,但并不是马上执行。
3、为什么Java是半编译半解释型语言?
JVM 设计者们的初衷仅仅只是单纯地为了满足 Java 程序实现跨平台特性,因此避免采用静态编译的方式由高级语言直接生成本地机器指令,从而诞生了实现解 释器在运行时采用逐行解释字节码执行程序的想法。
解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行,执行效率低。
JIT 编译器将字节码翻译成本地代码后,就可以做一个缓存操作,存储在方法区 的 JIT 代码缓存中(执行效率更高了)。
是否需要启动 JIT 编译器将字节码直接编译为对应平台的本地机器指令,则需要 根据代码被调用执行的频率而定。
JIT 编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其 直接编译为对应平台的本地机器指令,以此提升 Java 程序的执行性能。
一个被多次调用的方法,或者是一-个方法体内部循环次数较多的循环体都可以 被称之为“热点代码”。
目前 HotSpot VM 所采用的热点探测方式是基于计数器的热点探测。
在这里我们就会提出一个问题:JIT 编译器执行效率高为什么还需要解释器?
1.当程序启动后,解释器可以马上发挥作用,响应速度快,省去编译的时间,立即执行。
2.编译器要想发挥作用,把代码编译成本地代码,需要一定的执行时间,但编译 为本地代码后,执行效率高。就需要采用解释器与即时编译器并存的架构来换取 一个平衡点。