可以做伦铜的网站,企业oa,WordPress网站封装app教程,怎么做网站推广六安JVM#xff1a;字节码 前言1. JVM概述1.1 JVM vs JDK vs JRE1.1.1 JVM1.1.2 JDK1.1.2.1 常用的JDK8是Oracle JDK 还是 OpenJDK 1.1.3 JRE1.1.4 三者之间的关系与区别 1.2 什么是字节码?采用字节码的好处是什么?1.3 Java 程序从源代码到运行的过程1.4 JVM的生命周期1.5 JVM架… JVM字节码 前言1. JVM概述1.1 JVM vs JDK vs JRE1.1.1 JVM1.1.2 JDK1.1.2.1 常用的JDK8是Oracle JDK 还是 OpenJDK 1.1.3 JRE1.1.4 三者之间的关系与区别 1.2 什么是字节码?采用字节码的好处是什么?1.3 Java 程序从源代码到运行的过程1.4 JVM的生命周期1.5 JVM架构图 2. 字节码2.1 字节码文件是跨平台的吗2.2 class文件里面是什么 3. 解释器与JIT编译器 前言 1. JVM概述
1.1 JVM vs JDK vs JRE
1.1.1 JVM
Java 虚拟机JVM是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现WindowsLinuxmacOS目的是使用相同的字节码它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译随处可以运行”的关键所在。 JVM 并不是只有一种只要满足 JVM 规范每个公司、组织或者个人都可以开发自己的专属 JVM。 也就是说我们平时接触到的 HotSpot VM 仅仅是是 JVM 规范的一种实现而已。除了我们平时最常用的 HotSpot VM 外还有 J9 VM、Zing VM、JRockit VM 等 JVM 。
1.1.2 JDK
JDKJava 开发工具包JDK 是 Java 程序的开发环境它包含了用于开发、编译和调试 Java 程序所需的工具和库。JDK 包括了 JRE 和一系列开发工具如编译器javac、调试器jdb、JavaDoc 工具等。JDK 还提供了 Java 标准库和其他开发所需的类库。
1.1.2.1 常用的JDK8是Oracle JDK 还是 OpenJDK
在 JDK 8 的时代Oracle JDK 和 OpenJDK 都是常见的选择。一般来说Oracle JDK 8 是比较常用的版本因为它在 JDK 8 发布时是主要的 JDK 提供商 。Oracle JDK 8 在商业环境中提供了长期支持同时还包含了一些额外的闭源组件。
然而自 JDK 11 开始Oracle 将其 JDK 的开发重点转向了 OpenJDK并且 Oracle JDK 11 及以后的版本使用 GPL 许可协议与 OpenJDK 保持一致。这意味着从 JDK 11 开始OpenJDK 成为了更广泛使用的选择因为它是免费的、开源的并且由广大的开源社区支持。
总的来说对于 JDK 8Oracle JDK 是常见的选择但对于更高版本的 JDKOpenJDK 更为普遍。
1.1.3 JRE
JREJava 运行时环境JRE 是 Java 程序的运行环境它是 JVM 的一部分。JRE 包含了 JVM 和 Java 类库用于执行已编译的 Java 程序。它提供了 Java 应用程序所需的运行时支持包括线程管理、I/O、网络通信等功能。对于只需要运行 Java 程序的用户来说安装 JRE 即可。
1.1.4 三者之间的关系与区别
JDK 包含了 JREJDK 是开发环境提供了编译器和其他开发工具而 JRE 是运行环境用于执行已编译的 Java 程序。JRE 包含了 JVMJVM 是 Java 程序的运行环境负责将字节码翻译成机器码并提供运行时支持。JDK 不仅包含了 JRE 和 JVM还提供了用于开发 Java 程序所需的工具和类库。
1.2 什么是字节码?采用字节码的好处是什么?
在 Java 中JVM 可以理解的代码就叫做字节码即扩展名为 .class 的文件它不面向任何特定的处理器只面向虚拟机。Java 语言通过字节码的方式在一定程度上解决了传统解释型语言执行效率低的问题同时又保留了解释型语言可移植的特点。所以 Java 程序运行时相对来说还是高效的不过和 C、 CRustGo 等语言还是有一定差距的而且由于字节码并不针对一种特定的机器因此Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
1.3 Java 程序从源代码到运行的过程 我们需要格外注意的是 .class-机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件然后通过解释器逐行解释执行这种方式的执行速度会相对比较慢。而且有些方法和代码块是经常需要被调用的(也就是所谓的热点代码)所以后面引进了 JITJust in Time Compilation 编译器而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后其会将字节码对应的机器码保存下来下次可以直接使用。而我们知道机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言 。 HotSpot 采用了惰性评估(Lazy Evaluation)的做法根据二八定律消耗大部分系统资源的只有那一小部分的代码热点代码而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化因此执行的次数越多它的速度就越快。
1.4 JVM的生命周期
1.虚拟机的启动 Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的这个类是由虚拟机的具体实现指定的。
2.虚拟机的退出有如下的几种情况
某线程调用Runtime类或System类的exit方法或 Runtime类的halt方法并且Java安全管理器也允许这次exit或halt操作。 程序正常执行结束。 程序在执行过程中遇到了异常或错误而异常终止。 由于操作系统出现错误而导致Java虚拟机进程终止 。
1.5 JVM架构图 2. 字节码
2.1 字节码文件是跨平台的吗
是的
2.2 class文件里面是什么
3. 解释器与JIT编译器
解释器Interpreter和 JIT 编译器Just-In-Time Compiler都是用于执行程序的工具但它们的工作方式和作用有所不同。
解释器Interpreter
解释器是一种逐行执行程序代码的工具。它会逐行读取源代码并将其转换成计算机可以理解的机器语言然后执行这些指令。解释器不会将整个程序代码一次性地转换成机器语言而是在运行时逐行地解释和执行源代码。由于逐行解释的特性解释器的执行速度通常比较慢尤其是对于循环和复杂逻辑的程序。
JIT 编译器Just-In-Time Compiler
JIT 编译器是一种在运行时将程序代码动态地编译成机器语言的工具。它可以将整个函数或代码块编译成机器代码然后直接执行编译后的机器代码。JIT 编译器通常会在程序首次执行时或者某个函数首次被调用时进行编译以后再次执行相同代码时就可以直接使用编译后的机器代码从而提高了程序的执行速度。 但这里注意其实Java是半编译半解释型语言热点代码会先经过解释器解释称字节码文件待下次执行时直接在JIT编译器执行JIT 编译器通常会根据程序的运行情况和环境动态地进行优化以提高程序的执行效率。 AOT编译器