`
ayufox
  • 浏览: 276984 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[字节码系列]JVM字节码初探——JVM主要组成

阅读更多

      如同讲汇编必先讲计算机组成原理,在开始字节码之前,我们先了解一下JVM的主要构成。 在JVM的内部,主要由如下几个部分构成:


    1.数据区

  • 方法区:存放类定义信息、字节码、常量等数据,在Sun HotSpot JVM中,这块也称为Perm Gen。
  • 堆:创建的对象信息将放入堆中,堆内部如何实现各虚拟机各不相同,对于Sun HotSpot JVM来说又分为Young Gen和Tenured Gen,更详细描述参见《[Java性能剖析]Sun JVM内存管理和垃圾回收
  • Java栈:对于每个执行线程,会分配一个Java栈,JVM在执行过程当中,每执行一个方法,都会为方法在当前栈中增加一个栈帧,每个栈帧的信息与具体实现相关,但一般会由3部分组成:变量区,方法参数和本地变量会放入这个位置,大小是固定的,在进行方法时会先分配好,在类定义中,会由max local来指定这块区的大小;方法信息区,会包括当前类常量池的入口地址等信息,这块大小也是固定的;操作栈,与Intel体系架构中的运算使用寄存器来进行不一样,JVM的字节码的方法调用、运算等需要的参数,都是通过操作栈来传递的,在后面详细介绍中我们会进一步了解到,在类定义中,会由max stack指定最大的操作栈。关于Java栈的更详细描述参见《Java 栈内存介绍
  • 本地方法栈:对本地方法的调用,并不会使用Java栈而是使用本地方法栈,本地方法栈的组成取决于所使用的平台和操作系统
  • PC寄存器:对于每个执行线程会分配一个PC寄存器,寄存器中存放当前字节码的执行位置

      2.类加载器子系统
      类加载器完成类的加载工作,包括查找和装载类定义(.class)信息、连接(包括字节码验证、类变量内存分配和初始化、符号解析)和类初始化的过程

  • 查找和装载类定义(.class)信息:关于这块的内容可以google到无数的描述文档,JVM内部也提供了多种查找和装载类定义的途径,譬如从本地加载类定义、从远程加载类定义,甚至需要的话,我们可以对类定义进行加密在装载的时候做处理等等,更详细的描述也可以参见《[Tomcat源码系列] Tomcat 类加载器结构
  • 连接—字节码验证:对于加载的类定义,JVM必须确保其是合法的,包括定义的结构是合法的、声明的类信息(包括属性、方法等等)是合法的、字节码的正确性(包括确保操作码是合法的、有合法操作栈、goto语句能够到达一个合法的地址上等等)等等
  • 连接—类变量内存分配和初始化:在这个阶段,类变量将分配内存,并设置一个合法的初始化值,譬如对象是null、数值型是0、布尔值是false等等
  • 连接—符号解析:符号定义了类提供给外部可访问的服务以及类需要访问到的外部的服务,譬如类提供了方法给外部调用,或者类调用外部的方法,这些就是符号,符号解析过程就是将符号型的描述(譬如字符串)转换成实际的引用地址(譬如方法入口字节码指针地址),符号解析可能是在加载时进行,也有可能推迟到实际被使用到才去解析,但不管怎么样,JVM应该对外提供迟解析的印象,即不管何时解析符号,总是在符号被第一次访问的时候才会抛出异常,关于符号解析,后面会有专门的篇章更详细地介绍
  • 类初始化:类的初始化是在类第一次被引用到的时候进行,类初始化包括给类属性(static)设置初始化值、调用类中的static块代码,在字节码中,会有一个专门的<clinit>方法,类初始化的时候会调用这个方法,譬如如下

 

public class Test2
{
    public static int cout = 0;
    static
    {
        for (int i=0; i<100; i++)
        {
            cout += i;
        }
    }
}

  

 
     3.执行引擎:可以理解为CPU,是JVM最核心的部分。在Java虚拟机规范中,执行引擎的行为使用指令集来定义。对于每条指令,规范都详细规定了当实现执行到该指令时应该处理什么,但却没有定义如何处理,具体策略交给JVM的具体实现
     在后面的篇章,将继续介绍符号解析和字节码

     参考: <<深入Java虚拟机>>

5
1
分享到:
评论
1 楼 tian012 2011-02-28  

相关推荐

    JVM 字节码从入门到精通

    在了解JVM字节码之前,对于Java程序员而言,掌握Java底层知识,尤其是虚拟机和字节码的工作原理,对于成为一名优秀的开发者是很有帮助的。因此,本文从最简单的Java程序——打印"Hello, World"开始,逐步介绍如何将...

    jvm字节码自动加载

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

    实战Java虚拟机——JVM故障诊断与性能优化 pdf

    《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行...第11章介绍了虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。

    jvm字节码与类的加载.xmind

    自己总结的jvm中字节码与类的加载的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者

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

    字节码由一系列16位的指令组成,每个指令对应一个特定的操作,如加载、存储、运算、控制流程等。 2. **JVM与字节码**: JMV负责解析和执行字节码,它通过类加载器动态加载类文件,并对其进行校验,确保安全。然后...

    深入理解JVM.rar

    每个使用Java的开发者都知道Java字节码是在JRE中运行,而JVM则是JRE中的核心组成部分,承担分析和执行Java字节码的工作,而Java程序员通常并不需要深入了解JVM运行情况就可以开发出大型应用和类库。尽管如此,如果你...

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

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

    坚持写博客第一周--java基础知识回顾--jvm类加载1(csdn)————程序.pdf

    Java虚拟机(JVM)的类加载机制是Java运行时环境的重要组成部分,它负责将类的字节码文件从磁盘加载到内存中,并进行一系列处理以确保安全性和正确性。当我们通过`java`命令运行一个Java程序时,类加载器会开始工作...

    [字节码系列]ObjectWeb ASM构建Method Monitor

    【字节码系列】ObjectWeb ASM构建Method Monitor 在Java世界中,字节码是运行在JVM(Java虚拟机)上的程序表示形式。它是一种中间语言,允许开发者对Java代码进行低级别的操作,比如性能优化、动态代理、代码混淆等...

    HelloWorld的javap -verbose HelloWorld 字节码初探

    3. **JVM指令集**:讲解JVM指令集的主要指令,如ALOAD(加载本地变量)、ICONST(常量加载)、IRETURN(返回整数值)、INVOKEMETHOD(调用方法)等,并举例说明它们在字节码中的应用。 4. **字节码与源码的关系**:...

    jvm 详细介绍,了解jvm各个组成部分和功能

    JVM 在执行字节码时,会通过一系列机制来确保程序的安全性和高效性。首先,它具备一种名为“类加载器”(Class Loader)的组件,用于加载和管理程序中的类文件。类加载器不仅能够按需加载类文件,还能够支持热更新等...

    深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理).zip

    字节码执行引擎则是JVM的心脏,它通过解释器或即时编译器(JIT)将字节码转换为机器码。JIT技术能够在运行时动态优化代码,显著提升性能。此外,JVM的垃圾收集机制是其内存管理的关键,它自动回收不再使用的对象,...

    修改字节码 jclasslib

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

    JVM优化3(Tomcat参数调优,JVM参数调优,jvm字节码,代码优化).pdf

    本篇文件内容主要介绍了JVM优化的第三部分,重点围绕Tomcat参数调优、JVM参数调优、JVM字节码优化以及代码优化等几个方面。下面是针对这些知识点的详细解释: 1. Tomcat参数调优 在Tomcat参数调优部分,首先介绍了...

    ASM字节码操作简单实例

    字节码是Java虚拟机(JVM)理解的机器语言,由.class文件中的二进制数据组成。ASM提供了一套API,使得开发者能够以抽象语法树(AST)的形式解析和生成字节码。 面向切面编程(AOP)的核心思想是将关注点分离,将横...

    jvm相关代码仓库,包括类加载机制,字节码执行机制,JVM内存模型,GC垃圾回收,JV-jvm_practice.zip

    Java虚拟机(JVM)是Java程序运行的核心,它负责解析和执行字节码,管理内存,以及实现各种运行时特性。在这个名为"JV-jvm_practice.zip"的压缩包中,你将找到一系列关于JVM相关的代码示例,帮助你深入理解JVM的工作...

    Java 字节码简单说明.zip

    总的来说,Java字节码是Java平台的核心组成部分,它使得Java程序具有跨平台性和高效执行的特性。通过学习和理解字节码,开发者能更深入地掌握Java的运行机制,从而编写出更高效、更安全的代码。

    JVM中文指令手册.pdf

    JVM指令手册详细记录了JVM的所有操作码(opcode),也就是字节码指令。这些指令是给JVM解释器或者即时编译器(JIT)使用的低级指令集。在JVM上运行的Java程序会被编译成一系列指令,然后由JVM执行。 从给定文件的...

    轻松看懂Java字节码.pdf

    在实际分析Java字节码时,可以利用javap工具查看生成的字节码指令,例如以Main.class文件为例,会看到一系列的数字和字符组合。它们按照一定的格式描述了Java程序在执行时所需要的具体操作。文档中提到的内容部分...

Global site tag (gtag.js) - Google Analytics