kvm虚拟机简介

偷懒没有上传图片和表格,损失了一些内容

 

 

一、  虚拟机的概述

 

Java虚拟机和Java API一起组成了一个平台Java平台扮演了一个运行时Java程序与其下的硬件和操作系统之间的缓冲角色。

Java虚拟机的主要任务实装载class文件并且执行其中的字解码。虚拟机是实现平台无关的关键。

Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。

 

二、  各部件的功能

Class  Loadersclass loaders用来从各种sources例如当地文件系统和网络,动态的载入应用程序和类库。

Native Interface:本地接口允许允虚拟机在应用程序和类库中调用非java例程(routines)。

Execution Engine:执行引擎是虚拟机的核心。它执行通过class loaders载入的字解码指令。存在各种类型的执行引擎,例如:解释器和 just-in-time编译器。

Memory Manager:内存管理为对象实例提供了一个垃圾回收堆(garbage collected heap),并管理用来存储其它内部虚拟机数据结构的内存。

Services:这个部件由为标准类库特性例如threadsreflection提供必要内部虚拟机支持的子部件的一个集合(collection)组成。

 

三、  Java虚拟机的结构

Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。

Java数据分为两种类型:primitive types reference

Reference有三种数据类型: classarray,和interface

Java虚拟机中,最基本的数据单元就是字(word)。字长必须足够大,至少一个字单元就足以保存所有除longdouble类型之外类型的值。它仅仅是虚拟机实现的内部属性

 

四、  Runtime Data Areas

Java虚拟机在一个程序执行的时候定义了不同的数据区域。

The pc Register

每一个Java虚拟机线程有它自己的pcprogram counter)寄存器。在任何一个时间点,每个Java虚拟机线程只执行一个方法的代码,即该线程的当前方法。如果该方法不是native,也有说指向下一条将被执行的指令。如果是natviepc寄存器是不确定的。

 

五、  Java虚拟机栈

每一个Java虚拟机线程有一个私有的Java虚拟机栈,它和线程同时被创建。该栈存储frames。该栈用来保存局部变量和中间结果,方法调用和返回时也起作用。

而本地方法调用的状态,则是以某种依赖于具体实现的方式存储在本地方法栈中,也可能是在寄存器或者其它某些与特定实现相关的内存区中。

Java虚拟机是栈式的,它不定义或使用寄存器来传递或接受参数,其目的是为了保证指令集的简洁性和实现时的高效性

 

六、 

Java虚拟机有一个被所有Java虚拟机线程共享的堆。堆是运行时间数据区域,所有类实例化和数组所需空间都从那分配。虚拟机启动时堆就被创建。对象的堆存储空间是被一个自动存储管理系统即garbage collector回收,对象不会显性释放。

 

七、  方法区域

Java虚拟机有一个被所有Java虚拟机线程共享的方法区域。它存储了每个类结构例如:运行时常数池(runtime constant pool),域(field),静态数据,方法和构造函数的代码。 方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。

 

八、  运行时常数量池

虚拟机必须为每个被装载的类型维护一个常量池。它包含几种类型的常数,从编译时已经知道的数字文字(numeric literals)到必须在运行时解析的方法和域的引用。运行时常数池的功能就像传统编程语言中的符号表一样,不过它包含了更广的数据范围。

每一个运行时常数池都从Java虚拟机的方法区域分配。

Java源代码中所有的字符串文字最终都作为入口存储于常量池中。Java虚拟机把所有具有相同字符顺序的字符串文字处理为同一个String对象。

 

九、  Frames

frame用来存储数据和中间结果,也用来执行动态连接(常量池解析),方法返回值和发送异常。虚拟机的实现者还可以将其他信息放入帧数据区,如用于调试的数据等。

一个方法被调用时创建一个新的frameFrames从创建frame的线程的Java虚拟机stack的空间分配。每一个frame有自己的局部变量数组,自己的操作数栈和当前方法的类的运行时常数池的一个引用。在任何一个线程的任意点,只有一个frame,即当前正被执行的方法的frame是激活的。这个frame被称为当前frame,而它的方法被称为当前方法。

 

 

十、  局部变量区

 每个frame包含一个它的局部变量的数组。

局部变量区包含对应方法的参数和局部变量。编译器首先按声明顺序把这些参数放入局部变量数组。而对于真正的局部变量,它可以任意决定放置顺序。

长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。

Java虚拟机用局部变量在方法调用时传递参数。类方法调用时,索引从0开始。实例方法调用时,0索引对应的局部变量总是用来传递该实例方法所在对象的一个引用。

 

十一、         操作数栈

操作数栈也是被组织成一个以字长为单位的数组。和局部变量区不同的是,它不是通过索引来访问,而是通过标准的栈操作来访问的。

Java虚拟机提供载入常数或者局部变量的值或者fields到操作数栈的指令。操作数栈也被用来准备将被传递给方法的参数和接收方法结果。

 

十二、         本地方法栈

任何本地方法接口都会使用某种本地方法栈。当调用本地方法时,虚拟机会保持Java栈不变,虚拟机只是简单地动态连接并直接调用本地方法。如果某个虚拟机实现的本地方法接口是C连接模型的话,那么它的本地方法栈就是C栈。

很可能本地方法接口需要回调Java虚拟机中的Java方法,在这种情况下,该线程会保存本地方法栈的状态并进入到另一个Java栈。

 

十三、         对象的实现

对每个被装载的类型,虚拟机都会在方法区中存储一些类型信息:类型的全限定名 ,超类的全限定名 ,是类类型还是接口类型 ,任何直接超接口的全限定名的有序列表 等等。

如果某个方法不是抽象的和本地的,方法信息还必须保存:1、方法的字节码     2、异常表3、操作数栈和该方法的栈帧中的局部变量区的大小。

对于每一个被装载的类型(不管是类还是接口),虚拟机都会相应地为它创建一个java.lang.Class类的实例,而且虚拟机还必须把这个实例和存储在方法区中的类型数据关联起来。

 

十四、         数组对象

数组也拥有一个与它们的类相关联的Class类实例,所有具有相同维度和类型的数组都是同一个类的实例,而不管数组的长度是多少。数组的长度只与实例数据有关。

数组类的名称有两部分组成:每一维用一个方括号“[”表示,用字符或者字符串表示元素类型。比如:一维int数组的类名为“[i”

对于多维数组被表示为数组的数组了。比如,int类型的二维数组,将表示为一个一维数组,其中的每个元素是一个一维int数组的引用。

举例: int[2][2]   堆中存在3个对象实例(一个[[i2[i对象实例),方法区中保存了“[[i”“[i”类型信息。

 

 

十五、         Exception

Java虚拟机中,方法的每一个catch子句是用一个异常handler表示的。每一个异常handler描述了实现那个方法的Java虚拟机码的exception handler处于激活的偏移范围, 也描述了该exception handler能够处理的异常的类型,描述了将要处理那个异常的代码的位置。

如果导致异常的指令的偏移在那个exception handler的偏移范围内且异常类型是同一个类或者是exception handler处理的异常的类的子类的话,我们就说一个异常匹配一个exception handler

当一个异常被抛出来的时候,Java虚拟机在当前方法中搜索一个匹配的exception handler

 

十六、         Finally子句

子节码中的finally子句在方法内部的表现很象微型子程序Java虚拟机在每个try语句块和与其相关的catch子句的结尾处都会调用”finally子句的子例程。Finally子句结束后(这里的结束指的是finally子句最后一条语句正常执行完毕,但不包括抛出异常,或执行return等情况),隶属于这个finally子句的微型子例程执行返回操作。程序在第一次调用微型子例程的地方继续执行后面的语句。

如果在trycatch块中有一条return语句,这条语句将会在finally块执行之后才被执行。如果在finally块中有一条return语句返回一个值,那么这个值将被返回,而任何前面的return语句返回的值都无用。

不要依赖及时终结(finalization)来达到程序的正确性。 Finalization被调用的时间是不确定的。

同理,也不能依赖线程的优先级来达到程序的正确性。

 

 

十七、         Class文件格式

一个class文件是由8位的字节流组成。

一个class文件由单个ClassFile structure组成。

ClassFile {

             u4 magic;

           u2 constant_pool_count; 

      cp_info constant_pool[constant_pool_count-1];

                 u2 super_class;  //指向常量池表的一个有效索引

             u2 fields_count;

             field_info fields[fields_count];

           …………

}

 

constant_pool[]

常数池是一个表示各种字符串常量,类和接的口名字,域名,和ClassFile结构与它的子结构所中引用的其它常量的表结构。

methods[]

方法表中的每一个值必须是这个类或者接口中的方法的一个method_info结构体。如果这个方法不是本地或者抽象的,那么还需要提供实现这个方法的Java虚拟机指令。

 

 

十八、         Java的安全机制

         沙箱的基本组件如下四个:类装载器结构,class文件检验器,内置于Java虚拟机(及语言)的安全特性,安全管理器及Java API

         Java安全模型的前三个组成部分类装载器体系结构、class文件检验器以及Java中内置的安全特性一起达到一个共同的目的:保持Java虚拟机的实例和它正在运行的应用程序的内部完整性,使得他们不被下载的恶意或有漏洞的代码侵犯。第四个组成部分是安全管理器,它主要用于保护虚拟机的外部资源不被虚拟机内运行的恶意或有漏洞的代码侵犯。

         类装载器必须将每一个被装载的类放置在一个保护域中,一个保护域定义了这个代码在运行时将得到怎样的权限。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值