简述JVM(2)——本地方法接口和执行引擎

简介: 简述JVM(2)——本地方法接口和执行引擎

这篇文章是补充上篇文章没写完的内容,大家如果想看完整版,大家可以进入专栏,查看上篇文章


1.3 本地方法接口


本地方法就是底层不是由 Java 实现的方法,比如C/C++

一个本地方法就是一个Java调用非Java代码的接口,这个特性不是 Java 独有所有的语言都有这个特性,比如C++语言可能也会调用由C实现的底层函数。

定义一个本地方法时,不需要给它实现体,因为他的实现体是由非Java语言在外面实现的

关键字 native 可以与其他所有的 Java 标识符连用,但是 abstract 除外,因为这个类本来就是一个接口。


本地方法的用途:

1.与 Java 环境外交互:

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


2.与操作系统交互(比如线程最后要回归于操作系统线程):

JVM 支持着 Java 语言本身和运行库,它是 Java 程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管他有多么的强大,它毕竟不是一个完整的系统,它经常依赖于一些底层系统的支持。这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用 Java 实现了 jre 的与底层系统的交互,甚至 JVM的一些部分就是用 C 写的。还有,如果我们要使用一些 Java 语言本身没有提供封装的操作系统特性时,我们也需要使用本地方法。


1.4执行引擎


JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。那么,如果想要让一个 Java 程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上(操作系统)的本地机器指令才可以。简单来说,JVM 中的执行引擎将高级语言翻译为机器语言,这样机器就认识了。


前端编译和后端编译:

1.前端编译:从Java程序文件(.java)到字节码文件(.class)

2.后端编译:在运行时把 .class 文件编译成本地机器码


解释器和 JIT 编译器:

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

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


提到这就不得不提半编译半解释型语言:

就是即解释也编译,这样做的好处就是响应快,效率高。


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

JVM 设计者为了满足 Java 程序实现跨平台特性,所有没有由高级语言直接生成本地机器指令(操作系统不同本地机器指令也不同),从而诞生了实现解释器在运行时采用逐行解释字节码执行程序的想法。


解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行,因为解释一句执行一句,所以执行效率比较低。


JIT 编译器将字节码翻译成本地代码后,就可以做一个缓存操作,执行效率就变高了。是否需要启动 JIT 编译器将字节码直接编译为对应平台的本地机器指令,则需要根据代码被调用执行的频率而定。JIT 编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升 Java 程序的执行性能。(一个被多次调用的方法,或者是一-个方法体内部循环次数较多的循环体都可以被称之为“热点代码”。)


同时使用JIT 编译器和解释器的原因?

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

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


目录
相关文章
|
3月前
|
存储 算法 Java
JVM组成结构详解:类加载、运行时数据区、执行引擎与垃圾收集器的协同工作
【8月更文挑战第25天】Java虚拟机(JVM)是Java平台的核心,它使Java程序能在任何支持JVM的平台上运行。JVM包含复杂的结构,如类加载子系统、运行时数据区、执行引擎、本地库接口和垃圾收集器。例如,当运行含有第三方库的程序时,类加载子系统会加载必要的.class文件;运行时数据区管理程序数据,如对象实例存储在堆中;执行引擎执行字节码;本地库接口允许Java调用本地应用程序;垃圾收集器则负责清理不再使用的对象,防止内存泄漏。这些组件协同工作,确保了Java程序的高效运行。
22 3
|
3月前
|
缓存 监控 算法
吃透 JVM 诊断方法与工具使用
【8月更文挑战第4天】深入了解并掌握JVM诊断需把握几大要点:1) 熟悉JVM内存模型,如堆、栈及方法区;2) 掌握垃圾回收机制与算法;3) 运用工具如`jps`(查看Java进程)、`jstat`(监控运行状态)、`jmap`(生成堆快照)、`jhat`(分析堆快照)、`jstack`(检查线程栈); 4) 利用专业工具如Eclipse Memory Analyzer分析堆转储文件查找内存泄漏; 5) 动态监控与调整JVM参数; 6) 结合日志分析性能瓶颈。通过实战案例加深理解,有效应对JVM性能问题。
|
3月前
|
C# UED 开发者
WPF动画大揭秘:掌握动画技巧,让你的界面动起来,告别枯燥与乏味!
【8月更文挑战第31天】在WPF应用开发中,动画能显著提升用户体验,使其更加生动有趣。本文将介绍WPF动画的基础知识和实现方法,包括平移、缩放、旋转等常见类型,并通过示例代码展示如何使用`DoubleAnimation`创建平移动画。此外,还将介绍动画触发器的使用,帮助开发者更好地控制动画效果,提升应用的吸引力。
127 0
|
4月前
|
存储 缓存 自然语言处理
(三)JVM成神路之全面详解执行引擎子系统、JIT即时编译原理与分派实现
执行引擎子系统是JVM的重要组成部分之一,在JVM系列的开篇曾提到:JVM是一个架构在平台上的平台,虚拟机是一个相似于“物理机”的概念,与物理机一样,都具备代码执行的能力。
|
4月前
|
监控 安全 Java
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
107 2
|
4月前
|
Java Windows
Java演进问题之JVM在内存返还策略上会左右为难如何解决
Java演进问题之JVM在内存返还策略上会左右为难如何解决
|
4月前
|
缓存 Java 编译器
Java演进问题之JVMCI JIT编译器与JVM的交互如何解决
Java演进问题之JVMCI JIT编译器与JVM的交互如何解决
|
4月前
|
缓存 Prometheus 监控
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
90 3
|
4月前
|
缓存 监控 算法
Java面试题:讨论JVM性能调优的常见方法和技巧。
Java面试题:讨论JVM性能调优的常见方法和技巧。
52 1
|
3月前
|
监控 Java Android开发
吃透 JVM 诊断方法与工具使用
【8月更文挑战第3天】要精通JVM诊断,需掌握关键监控指标如内存(堆/非堆)、CPU使用及线程状态;熟悉工具如`jstat`(监控状态)、`jmap`(堆转储)、`jstack`(线程堆栈);并能利用Eclipse Memory Analyzer (MAT)分析堆转储找内存泄漏;同时理解GC日志以优化垃圾回收行为;通过实践案例加深理解。