`

JVM的字节码解析

 
阅读更多

       JVM是基于栈执行的,每个线程会建立一个操作栈,每个栈又包含了若干个栈帧, 每个栈帧包含了局部变量、操作数栈、动态连接、方法的返回地址信息等。其实在我们编译的时候,需要多大的局部变量表、操作数深度等已经确定并写入了Code属性,因此运行时内存消耗的大小在启动时已经已知。

       在栈帧中,最小的单位为变量槽(Variable Slot),其中每个Slot占用32个字节。在32bit的JVM中32位的 数据类型占用1个Slot,64bit数据占用2个Slot;在64bit中使用64bit字节填充来模拟32bit(又称补位),因此我们可以得出结论:64bit的JVM比32bit的更消耗内存,但是又出32bit机器的内存上限限制,有时候牺牲一部分还是值得的。Java的基本数据类型中,除了long、double两种数据类型为64bit以外,boolean、byte、char、int、float、reference等都是32bit的数据类型,以及其他变量也只占用一个变量槽,仅仅作为一个引用。

       在栈帧中,局部变量表中的Slot是可以复用的,如在一个方法返回给上一个方法时就可以通过公用Slot的方法来节约内存控件,但这在一定程度上会影响垃圾回收,因此JVM不确定这块Slot空间是否还需要复用。

局部变量并没有类实例变量那样的连接过程,前面我们说过,类的加载分为加载、连接、初始化三个阶段,其中连接分为验证、准备、解析三个阶段,而验证是确保类加载的正确性、准备是为类的静态变量分配内存,并初始化为默认值、解析是把类中的符号引用转换为直接引用。而外面的初始化为类的静态变量赋值为正确的值。而局部变量并没有连接的阶段,因此没有赋值为默认值这一阶段,因此必须自己初始化才能使用。所以在局部变量中使用String s;然后又使用s的方法会报错。

分享到:
评论

相关推荐

    jvm字节码自动加载

    在Java虚拟机(JVM)中,字节码自动加载是一项关键...总之,JVM字节码自动加载是一个涉及类加载器、双亲委派模型以及字节码解析和验证的复杂过程。掌握这些知识有助于我们更好地理解和调试Java应用程序,提升开发效率。

    使用Java语言实现一个漂亮的字节码解析器CLI

    一个使用Java完成的解析JVM字节码文件的框架。 该框架的愿景为:从零到一实现一个字节码解析类库,从中了解JVM的一些规范,和Java代码编译后的组织方式。借助GraalVM的native-image工具,实现一个输出友好且漂亮的...

    jvm-callgraph,jvm字节码的调用图生成器.zip

    《深入解析JVM字节码调用图生成器——基于jvm-callgraph开源项目》 在Java虚拟机(JVM)的世界里,理解和优化代码执行性能是至关重要的。为了达到这一目的,开发者需要深入理解程序的运行时行为,其中就包括了类与...

    深入解析Java中的JVM字节码:原理、作用与代码示例

    JVM字节码是Java程序跨平台运行的关键,它不仅保证了Java程序的可移植性,还通过JIT编译技术提高了程序的执行效率。理解JVM字节码的原理和构成对于Java开发者来说至关重要,它有助于我们深入理解Java程序的运行机制...

    JVM 完整深入解析.pdf

    程序计数器是当前线程所执行的字节码的行号指示器,是线程私有的内存区域。由于Java是多线程并发执行的,每个线程都需要有一个独立的程序计数器,以便记录线程切换后继续执行的位置。 #### 虚拟机栈 虚拟机栈是Java...

    字节码解析01.rar

    标题中的"字节码解析01.rar"指的是一个压缩包文件,包含了关于字节码解析的初步内容。这个教程可能是为那些想深入了解Java字节码工作原理或者希望自定义字节码解析工具的学习者准备的。 描述中提到,这个教程会展示...

    字节码解析示例与说明解析

    在Java编程语言中,字节码是程序执行的关键部分,它是Java虚拟机(JVM...通过学习和解析字节码,开发者可以深化对JVM的理解,从而提升开发效率和程序性能。对于Java开发者来说,掌握字节码的知识是进阶技能的重要一环。

    字节码实战包含class,字节码.zip

    在Java编程语言中,字节码(Bytecode)扮演着至关重要的角色,它是JVM(Java虚拟机)理解和执行程序的基础。"字节码实战"的主题深入探讨了字节码的概念、生成以及如何利用它来优化Java应用程序。下面将详细阐述相关...

    JVM指令码表.zip

    Java虚拟机(JVM)是Java程序运行的核心,它通过解析和执行字节码来实现程序的运行。字节码是一系列二进制指令,这些指令在类文件中以16进制形式表示,每条指令占据一个或多个字节。`JVM指令码表.zip`包含的`JVM指令...

    jclasslib,JClullb字节码查看器是一种工具,它可以可视化编译的Java类文件和包含的字节码的所有方面。.zip

    字节码的使用使得Java具有跨平台的特性,因为不同的操作系统上的JVM可以理解和执行相同的字节码。 **JClasslib的功能** JClasslib字节码查看器提供了以下功能: 1. **类文件结构**:展示类文件的整体结构,包括...

    从一个class文件深入理解Java字节码结构

    Java程序在执行时,首先需要通过Java编译器将源代码(.java文件)编译成二进制的字节码文件(.class文件),这些字节码由Java虚拟机(JVM)解析并执行。深入理解字节码结构有助于我们了解Java程序的运行机制,优化...

    Bytecoder:用于JVM字节码的丰富域模型和用于解释和转换它的框架

    当前构建状态:高水平目标能够将JVM字节码交叉编译为JavaScript,WebAssembly,OpenCL和其他语言主要的编译目标是JavaScript和WebAssembly 充当...OpenJDK 14作为JRE Classlib支持编译策略JVM字节码被解析并转换为中间表示...

    深入理解jvm

    1. **JVM基础**:JVM是Java语言的运行平台,它负责解析字节码并执行Java程序。书中会详细介绍JVM的结构,包括类加载子系统、运行时数据区、执行引擎等组成部分,让读者明白Java程序是如何在JVM上运行的。 2. **内存...

    bytecode-basics:“JVM 字节码简介”会话的源代码

    "JVM字节码简介"这个会话可能深入探讨了如何理解和分析Java字节码,以提升程序性能、进行反编译或优化。源代码通常包括用于解释和演示这些概念的示例。 Java字节码是编译后的程序代码,它是平台无关的,由Javac...

    java字节码文件查看工具,查看class文件

    字节码是平台无关的,这意味着它能在任何支持Java虚拟机(JVM)的系统上运行。通过查看反编译的字节码,我们可以看到类的方法定义、变量声明、控制流结构等,这些都是原始Java源代码的逻辑表示。 在JD-GUI中,我们...

    修改class字节码需要的工具.zip

    2. **ClassPy 0.6**: 这是一个基于Python的库,用于读取、解析、修改和写入Java字节码。对于熟悉Python的开发者来说,ClassPy提供了一种命令行或脚本方式来处理字节码。它支持JVM规范中的各种指令,可以用于自动化...

    JVM--字节码和类的加载篇1

    Java虚拟机(JVM)是Java程序的核心组成部分,它负责执行字节码,这是Java程序在编译后的二进制形式。"JVM--字节码和类的加载篇1"这个标题暗示了我们将深入理解JVM如何处理字节码以及类加载的过程。 在Java的Class...

    java字节码编辑器

    1. **分析**:首先,编辑器会读取`.class`文件,解析其中的字节码,将其转换为人类可读的格式,如汇编语言形式,便于理解。 2. **编辑**:然后,用户可以查看并修改这些指令。这可能涉及到替换特定的字节码,插入新...

    修改字节码 jclasslib

    《深入解析:修改字节码工具——jclasslib》 在Java编程中,字节码是JVM(Java虚拟机)执行的中间语言,它是由Java编译器将源代码编译成的一种二进制格式。理解并操作字节码对于优化程序性能、调试、逆向工程以及...

Global site tag (gtag.js) - Google Analytics