JVM学习--JVM本地方法和执行引擎
Posted 肖帆咪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM学习--JVM本地方法和执行引擎相关的知识,希望对你有一定的参考价值。
JVM组合拳往期文章
本地方法接口
##1什么是本地方法
**一个Native Method就是一个java调用非java代码的接口,**一个native method 是这样一个java方法:底层由非java语言实现
关键字 native 可以与其他所有的 java 标识符连用,但是 abstract 除外。
2为什么要使用Native Method
- 与java环境外交互:本地方法是交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解 java 应用之外的繁琐细节
- 与操作系统交互(比如线程最后要回归于操作系统线程):JVM 支持着 java 语言本身和运行库,它是 java 程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。如果我们要使用一些 java语言本身没有提供封装的操作系统特性时,我们也需要使用本地方法
- Sun`s Java: Sun 的解释器是用 C 实现的,这使得它能像一些普通的 C 一样与外部交互。jre
大部分是用 java 实现的,它也通过一些本地方法与外界交互。
执行引擎
1 概述
- 执行引擎是java虚拟机核心组成部分之一
- JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。
- JVM 中的执行引擎充当了将高级语言翻译为机器语言的译者
注意区分概念:
- 前端编译:从java程序员到字节码文件的过程
- 执行引擎有两种行为:一种是解释执行,一种是编译执行(后端编译)
2什么是解释器?什么是JIT编译器?
解释器:当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方法执行,将每条字节码文件"翻译"成对应平台的本地机器指令执行
**JIT编译器:**就是虚拟机将源代码一次性直接编译成和本地及其平台相关的机器语言,但并不是马上执行
3为什么Java是半编译半解释型语言?
JVM 设计者们的初衷仅仅只是单纯地为了满足 Java 程序实现跨平台特性,因此避免采用静态编译的方式由高级语言直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码执行程序的想法。
解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行,执行效率低。
JIT 编译器将字节码翻译成本地代码后,就可以做一个缓存操作,存储在方法区的 JIT 代码缓存中(执行效率更高了)。
是否需要启动 JIT 编译器将字节码直接编译为对应平台的本地机器指令,则需要根据代码被调用执行的频率而定。JIT 编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升 Java 程序的执行性能。一个被多次调用的方法,或者是一-个方法体内部循环次数较多的循环体都可以被称之为“热点代码”。
目前 HotSpot VM 所采用的热点探测方式是基于计数器的热点探测
JIT编译器执行效率高为什么还需要解释器?
- 当程序启动后,解释器马上发挥作用,响应速度快,省去编译时间,立即执行
- 编译器想要发挥作用,把代码编译成本地代码,需要一定的执行时间,但编译为本地代码后,执行效率高,需要采用解释器与即时编译器并存的架构换取一个平衡点
以上是关于JVM学习--JVM本地方法和执行引擎的主要内容,如果未能解决你的问题,请参考以下文章