【JVM】本地方法接口和执行引擎

本地方法接口

什么样的方法是本地接口

        简单来讲,一个 Native Method 就是一个 java 调用非 java 代码的接口,被 native 关键字修饰,不是 Java 语言实现,而是由操作系统实现的方法

        一个Native Method 是这样一个 java 方法:该方法的底层实现由非 Java 语言实现,比如 C。这个特征并非 java 特有,很多其他的编程语言都有这一机制在定义一个 native method 时,并不提供实现体(有些像定义一个 Javainterface),因为其实现体是由非 java 语言在外面实现的。关键字 native 可以与其他所有的 java 标识符连用,但是 abstract 除外。

Java为什么要使用本地方法

        上层的高级语言没有对底层硬件直接操作的权限,需要调用操作系统提供的接口进行访问。

        有时 java 应用需要与 java 外面的环境交互,这是本地方法存在的主要原因。 你可以想想 java 需要与一些底层系统,如某些硬件交换信息时的情况。本地方法正式这样的一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解 java 应用之外的繁琐细节。

执行引擎

        负责将装载到虚拟机中的字节码解释/编译为机器码。

        .java —— javac 前端编译 ——> .class

        .class —— 执行引擎 ——> 机器码 (后端编译)

        解释执行:用一个解释器对代码逐行进行解释执行,一般常见的脚本语言是解释执行的。虽然效率低,但是省去了编译的时间。

        编译执行:是将某段代码进行整体编译,然后执行编译后的结果。虽然花费时间,但是执行效率高。

什么是解释器?什么是 JIT 编译器?

        解释器:当 Java 虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。

        JIT(Just In Time Compiler)编译器:就是虚拟机将源代码一次性直接编译成和本地机器平台相关的机器语言,但并不是马上执行。

为什么 Java 是半编译半解释型语言?

        JVM 设计者们的初衷仅仅只是单纯地为了满足 Java 程序实现跨平台特性,因此避免采用静态编译的方式由高级语言直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码执行程序的想法。解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行,执行效率低。JIT 编译器将字节码翻译成本地代码后,就可以做一个缓存操作,存储在方法区的 JIT 代码缓存中(执行效率更高了)。是否需要启动 JIT 编译器将字节码直接编译为对应平台的本地机器指令,则需要根据代码被调用执行的频率而定。JIT 编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升 Java 程序的执行性能。一个被多次调用的方法,或者是一个方法体内部循环次数较多的循环体都可以被称之为“热点代码”。目前 HotSpot VM 所采用的热点探测方式是基于计数器的热点探测。

JIT 编译器执行效率高为什么还需要解释器?

        1.当程序启动后,解释器可以马上发挥作用,响应速度快,省去编译的时间,立即执行。

        2.编译器要想发挥作用,把代码编译成本地代码,需要一定的执行时间,但编译为本地代码后,执行效率高。就需要采用解释器与即时编译器并存的架构来换取一个平衡点。

总结

       Java 执行引擎采用的是半解释半编译的方式将字节码转为机器码。程序刚开始运行时,立即采用逐行解释执行;程序运行过程中,会将热点代码编译并缓存起来。这两者结合使用,可以提高运行效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值