当前位置: 首页 > 编程笔记 >

Java字节码中jvm实例用法

呼延才俊
2023-03-14
本文向大家介绍Java字节码中jvm实例用法,包括了Java字节码中jvm实例用法的使用技巧和注意事项,需要的朋友参考一下

要想使Java运行,我们可以设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换为它可以识别的指令序列,也称为Java字节码。由于Java字节码指令的操作码被固定为一个字节,所以它的名字就这样命名了。本篇要带来的是Java字节码中jvm的使用,主要分为两个操作视角,一起来看看具体内容吧。

1、虚拟机视角

在执行Java代码时,首先需要将编译后的class文件装入Java虚拟机。装入的Java类将存储在方法区(MethodArea)中。虚拟机会在实际运行时执行方法区内的代码。JavaVirtualMachines将堆和栈分割为内存,以存储运行时数据。JavaVirtualProfessional将栈细分为面向Java方法的Java方法栈、面向本地方法(用C++写的native方法)的本地方法栈和存放各个线程执行位置的PC寄存器。

调用将进入Java方法,而Java虚拟机会将在当前线程的Java方法栈中生成用于存储本地变量和字节码操作数的栈帧。该栈帧的大小是事先计算好的,并且Java虚拟机不需要连续地在内存空间中分布栈帧。Java虚拟机在退出当前执行的方法时,无论是正常还是异常,都将弹出当前线程的当前栈帧,并放弃该帧。

2、硬件视角

Java字节代码不能直接执行,因此Java虚拟机需要将字节代码翻译成机器代码。在HotSpot中,翻译过程有两种形式

1、是说明执行,把字节代码翻译成机器代码执行

2、是即时编译(Just-In-Timecompilation、JIT),将一种方法包含的所有字节代码编译成机器代码后执行。

前者的优势是不需要等待编译,后者的优势是实际运行速度更快。

知识点扩充:

作为一个Java开发者,对技术的追求而不仅仅停留在会用API,会写基本功能上,要想在技术上有更高的造诣,就需要深入到原理层面去认识代码运行的机制。因此,本文从class字节码文件的结构入手,一步步来解剖二进制字节码的内部工作原理,这对深入理解JVM的运行机制大有裨益,同时,对于想要使用BCEL来动态改变Class字节码指令的工作也很有帮助(示例:JVM Class字节码之三-使用BCEL改变类属性)。

什么是Class文件

Java字节码类文件(.class)是Java编译器编译Java源文件(.java)产生的“目标文件”。它是一种8位字节的二进制流文件, 各个数据项按顺序紧密的从前向后排列, 相邻的项之间没有间隙, 这样可以使得class文件非常紧凑, 体积轻巧, 可以被JVM快速的加载至内存, 并且占据较少的内存空间(方便于网络的传输)。

Java源文件在被Java编译器编译之后, 每个类(或者接口)都单独占据一个class文件, 并且类中的所有信息都会在class文件中有相应的描述, 由于class文件很灵活, 它甚至比Java源文件有着更强的描述能力。

class文件中的信息是一项一项排列的, 每项数据都有它的固定长度, 有的占一个字节, 有的占两个字节, 还有的占四个字节或8个字节, 数据项的不同长度分别用u1, u2, u4, u8表示, 分别表示一种数据项在class文件中占据一个字节, 两个字节, 4个字节和8个字节。 可以把u1, u2, u3, u4看做class文件数据项的“类型” 。

到此这篇关于Java字节码中jvm实例用法的文章就介绍到这了,更多相关Java字节码中jvm的使用内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 想要让一个Java程序正确地运行在JVM中,Java源码就必须要被编译为符合JVM规范的字节码。 前端编译器的主要任务就是负责将符合Java语法规范的Java代码转换为符合JVM规范的字节码文件。 javac是一种能够将Java源码编译为字节码的前端编译器。 Javac编译器在将Java源码编译为一个有效的字节码文件过程中经历了4个步骤,分别是词法解析、语法解析、语义解析以及生成字节码。 一个语言

  • 本文向大家介绍java IO 字节流详解及实例代码,包括了java IO 字节流详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 java IO 字节流详解 1.         如何理解输入输出流? 这是我当初在学习Java IO这一块很难理解的一块,输入输出流我们可必须以一个为参照物:我们以内存为参照物,凡是写入内存的我们叫输入流,从内存中写出的我们叫输出流。看下面的示例图 有了这样的一

  • 当试图通过IntelliJ运行示例CorDapp(GitHub CorDapp)时,我收到以下错误: 无法将用JVM目标1.8构建的字节码内联到正在用JVM目标1.6构建的字节码中 如何修改IntelliJ设置,使所有字节码都是用相同的JVM目标构建的?

  • 我在尝试向我的kotlin spring项目添加一些依赖项时遇到了一个问题。我使用Spring Boot初始化器来运行一个基本项目。 我的问题:如果我取消对jackson或Koin依赖项的注释,那么我的构建就会失败,在titile中提到了build.gradle.kts文件,这里是build.gradle.kts: 我已经有了KotlinCompile jvmTarget选项,并且在我的构建设置中

  • 问题内容: 字节码如何在JVM中得到验证? 问题答案: 甲骨文本身有它如何工作的一个小片段页面在这里。 基本上,JRE不信任JDK。那是因为它不知道哪个JDK编译器创建了类文件。它将类文件视为恶意文件,直到通过验证。 对此进行扩展,字节码验证是防止Sun称为“恶意编译器”的必要步骤。Sun自己的Java编译器可确保Java源代码不违反安全规则,但是,当应用程序导入代码片段时,它实际上并不 知道 该

  • 问题内容: 我正在寻找用Java字节码编写一个简短的程序(也许是Hello World)。我只想使用我的文本编辑器编写字节码并运行它。我该怎么做?有一个例子吗?谢谢! 问题答案: 您可以尝试茉莉! 您可以使用以下命令进行编译: 然后像任何类一样运行它: 更新资料 我看到您的问题提到“不使用Javac或Java”。您能说明一下该声明的意思吗?