知识大全 Java虚拟机概念及体系结构详述
Posted 虚拟机
篇首语:沧海横流,方显英雄本色;青山矗立,不堕凌云之志。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java虚拟机概念及体系结构详述相关的知识,希望对你有一定的参考价值。
Java虚拟机概念及体系结构详述 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
一 什么是Java虚拟机
Java虚拟机是一个想象中的机器 在实际的计算机上通过软件模拟来实现 Java虚拟机有自己想象中的硬件 如处理器 堆栈 寄存器等 还具有相应的指令系统
为什么要使用Java虚拟机
Java语言的一个非常重要的特点就是与平台的无关性 而使用Java虚拟机是实现这一特点的关键 一般的高级语言如果要在不同的平台上运行 至少需要编译成不同的目标代码 而引入Java语言虚拟机后 Java语言在不同平台上运行时不需要重新编译 Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息 使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码) 就可以在多种平台上不加修改地运行 Java虚拟机在执行字节码时 把字节码解释成具体平台上的机器指令执行
谁需要了解Java虚拟机
Java虚拟机是Java语言底层实现的基础 对Java语言感兴趣的人都应对Java虚拟机有个大概的了解 这有助于理解Java语言的一些性质 也有助于使用Java语言 对于要在特定平台上实现Java虚拟机的软件人员 Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说 则必须深刻理解Java虚拟机的规范 另外 如果你想扩展Java语言 或是把其它语言编译成Java语言的字节码 你也需要深入地了解Java虚拟机
Java虚拟机支持的数据类型
Java虚拟机支持Java语言的基本数据类型如下:
◆byte:// 字节有符号整数的补码
◆short:// 字节有符号整数的补码
◆int:// 字节有符号整数的补码
◆long:// 字节有符号整数的补码
◆float:// 字节IEEE 单精度浮点数
◆double:// 字节IEEE 双精度浮点数
◆char:// 字节无符号Unicode字符
几乎所有的Java类型检查都是在编译时完成的 上面列出的原始数据类型的数据在Java执行时不需要用硬件标记 操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型 例如iadd ladd fadd和dadd指令都是把两个数相加 其操作数类型别是int long float和double 虚拟机没有给boolean(布尔)类型设置单独的指令 boolean型的数据是由integer指令 包括integer返回来处理的 boolean型的数组则是用byte数组来处理的 虚拟机使用IEEE 格式的浮点数 不支持IEEE格式的较旧的计算机 在运行Java数值计算程序时 可能会非常慢
虚拟机支持的其它数据类型包括:
◆object//对一个Javaobject(对象)的 字节引用
◆returnAddress// 字节 用于jsr/ret/jsr w/ret w指令
注:Java数组被当作object处理
虚拟机的规范对于object内部的结构没有任何特殊的要求 在Sun公司的实现中 对object的引用是一个句柄 其中包含一对指针:一个指针指向该object的方法表 另一个指向该object的数据 用Java虚拟机的字节码表示的程序应该遵守类型规定 Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序 Java虚拟机由于字节码定义的限制似乎只能运行于 位地址空间的机器上 但是可以创建一个Java虚拟机 它自动地把字节码转换成 位的形式 从Java虚拟机支持的数据类型可以看出 Java对数据类型的内部格式进行了严格规定 这样使得各种Java虚拟机的实现对数据的解释是相同的 从而保证了Java的与平台无关性和可移植性
二 Java虚拟机体系结构
Java虚拟机由五个部分组成:一组指令集 一组寄存器 一个栈 一个无用单元收集堆(Garbage collected heap) 一个方法区域 这五部分是Java虚拟机的逻辑成份 不依赖任何实现技术或组织方式 但它们的功能必须在真实机器上以某种方式实现
Java指令集
Java虚拟机支持大约 个字节码 每个字节码执行一种基本的CPU运算 例如 把一个整数加到寄存器 子程序转移等 Java指令集相当于Java程序的汇编语言
Java指令集中的指令包含一个单字节的操作符 用于指定要执行的操作 还有 个或多个操作数 提供操作所需的参数或数据 许多指令没有操作数 仅由一个单字节的操作符构成
虚拟机的内层循环的执行过程如下:
do
取一个操作符字节;
根据操作符的值执行一个动作;
while(程序未结束)
由于指令系统的简单性 使得虚拟机执行的过程十分简单 从而有利于提高执行的效率 指令中操作数的数量和大小是由操作符决定的 如果操作数比一个字节大 那么它存储的顺序是高位字节优先 例如 一个 位的参数存放时占用两个字节 其值为:
第一个字节* +第二个字节字节码指令流一般只是字节对齐的 指令tableswitch和lookup是例外 在这两条指令内部要求强制的 字节边界对齐
寄存器
Java虚拟机的寄存器用于保存机器的运行状态 与微处理器中的某些专用寄存器类似
Java虚拟机的寄存器有四种:
◆pc:Java程序计数器
◆optop:指向操作数栈顶端的指针
◆frame:指向当前执行方法的执行环境的指针
◆vars:指向当前执行方法的局部变量区第一个变量的指针
Java虚拟机
Java虚拟机是栈式的 它不定义或使用寄存器来传递或接受参数 其目的是为了保证指令集的简洁性和实现时的高效性(特别是对于寄存器数目不多的处理器)
所有寄存器都是 位的
栈
Java虚拟机的栈有三个区域:局部变量区 运行环境区 操作数区
( )局部变量区 每个Java方法使用一个固定大小的局部变量集 它们按照与vars寄存器的字偏移量来寻址 局部变量都是 位的 长整数和双精度浮点数占据了两个局部变量的空间 却按照第一个局部变量的索引来寻址 (例如 一个具有索引n的局部变量 如果是一个双精度浮点数 那么它实际占据了索引n和n+ 所代表的存储空间 )虚拟机规范并不要求在局部变量中的 位的值是 位对齐的 虚拟机提供了把局部变量中的值装载到操作数栈的指令 也提供了把操作数栈中的值写入局部变量的指令
( )运行环境区 在运行环境中包含的信息用于动态链接 正常的方法返回以及异常传播
◆动态链接
运行环境包括对指向当前类和当前方法的解释器符号表的指针 用于支持方法代码的动态链接 方法的class文件代码在引用要调用的方法和要访问的变量时使用符号 动态链接把符号形式的方法调用翻译成实际方法调用 装载必要的类以解释还没有定义的符号 并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址 动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码
◆正常的方法返回
如果当前方法正常地结束了 在执行了一条具有正确类型的返回指令时 调用的方法会得到一个返回值 执行环境在正常返回的情况下用于恢复调用者的寄存器 并把调用者的程序计数器增加一个恰当的数值 以跳过已执行过的方法调用指令 然后在调用者的执行环境中继续执行下去
◆异常和错误传播
异常情况在Java中被称作Error(错误)或Exception(异常) 是Throwable类的子类 在程序中的原因是:①动态链接错 如无法找到所需的class文件 ②运行时错 如对一个空指针的引用
·程序使用了throw语句
当异常发生时 Java虚拟机采取如下措施:
·检查与当前方法相联系的catch子句表 每个catch子句包含其有效指令范围 能够处理的异常类型 以及处理异常的代码块地址
·与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内 发生的异常类型是其能处理的异常类型的子类型 如果找到了匹配的catch子句 那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块 重复寻找匹配的catch子句的过程 直到当前方法的所有嵌套的catch子句都被检查过
·由于虚拟机从第一个匹配的catch子句处继续执行 所以catch子句表中的顺序是很重要的 因为Java代码是结构化的 因此总可以把某个方法的所有的异常处理器都按序排列到一个表中 对任意可能的程序计数器的值 都可以用线性的顺序找到合适的异常处理块 以处理在该程序计数器值下发生的异常情况
·如果找不到匹配的catch子句 那么当前方法得到一个 未截获异常 的结果并返回到当前方法的调用者 好像异常刚刚在其调用者中发生一样 如果在调用者中仍然没有找到相应的异常处理块 那么这种错误传播将被继续下去 如果错误被传播到最顶层 那么系统将调用一个缺省的异常处理块
( )操作数栈区 机器指令只从操作数栈中取操作数 对它们进行操作 并把结果返回到栈中 选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel )上 也能够高效地模拟虚拟机的行为 操作数栈是 位的 它用于给方法传递参数 并从方法接收结果 也用于支持操作的参数 并保存操作的结果 例如 iadd指令将两个整数相加 相加的两个整数应该是操作数栈顶的两个字 这两个字是由先前的指令压进堆栈的 这两个整数将从堆栈弹出 相加 并把结果压回到操作数栈中
每个原始数据类型都有专门的指令对它们进行必须的操作 每个操作数在栈中需要一个存储位置 除了long和double型 它们需要两个位置 操作数只能被适用于其类型的操作符所操作 例如 压入两个int类型的数 如果把它们当作是一个long类型的数则是非法的 在Sun的虚拟机实现中 这个限制由字节码验证器强制实行 但是 有少数操作(操作符dupe和swap) 用于对运行时数据区进行操作时是不考虑类型的
无用单元收集堆
Java的堆是一个运行时数据区 类的实例(对象)从中分配空间 Java语言具有无用单元收集能力:它不给程序员显式释放对象的能力 Java不规定具体使用的无用单元收集算法 可以根据系统的需求使用各种各样的算法
方法区
cha138/Article/program/Java/hx/201311/26748相关参考
教您如何在Linux下配置Java开发环境详述 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 去
深究Java虚拟机 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!JVM:JavaVirtualMa
Java虚拟机关闭钩子 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! javalangRunti
《深入理解Java虚拟机》笔记 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在C里面我们想
Java程序员的迷失—论“虚拟机” 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 虚拟机技术现在
JAVA虚拟机实例学习笔记一 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 编译顺序
JAVA虚拟机实例学习笔记二 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 数组 数组也是
发现Java虚拟机内存泄露问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!内存泄露问题对于程序来
降低Java虚拟机的风险 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 由于在微软的环境中使用J
深入Java虚拟机之内存优化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!