当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

Java虚拟机构造底子研究之一[Java编程]

赞助商链接



  本文“Java虚拟机构造底子研究之一[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

JVM履行的对象就是大家非常熟习的class文件,我们也称为类文件,JVM标准定义的这个编译完成的代码文件(固然并非强迫要求是实际的文件)的格局非常的详实,但是我们这里只说一些宏观的内容,今后有机会再研究细节的内容吧.JVM要求的类文件的格局是和硬件和操作系统无关的一种二进制格局,它切肯定义了类大概接口的表示,它乃至包含了字节次序这样的细节,而字节次序在特定平台的目标文件格局中普通都是固定的,不会举行阐明.

JVM所支持的数据范例和Java语言标准中定义的几近一样,请注意是几近一样!也就是原始范例和引用范例,他们可以被存储在变量表中,也可以作为参数传送、被办法返回,更普通的就是成为操作的对象.为什么和Java语言标准中定义的不完好一样呢?因为JVM中有一种Java语言所没有的原始范例:返回地址范例(returnAddress type).该范例是jsr, ret以及jsr_w指令需求利用到的,它的值是JVM指令的操作码的指针,并且它的值是不能被运行中的程序所改正的.

别的需求提到的就是布尔范例的值,固然在Java语言中它是完好独立的值,但是在JVM中只供应了对它的有限支持,表目前:

没有单独的操作布尔范例的指令,源代码中的布尔范例的操作在编译今后是作为int范例的值举行操作的.

JVM直接支持布尔数组,newarray指令可以成立布尔数组,而它的拜候和改正操作倒是利用byte范例的数组的操作指令举行的:baload,bastore.(在JDK1.0,1,1以及1.2中,布尔数组被编码为byte数组,每个元素是8位)

JVM用1代表true,用0代表false,编译器将源代码中的布尔范例映射为JVM中的int范例,并且必须和JVM的要求一致.

别的JVM标准中关于浮点范例的数占据大段的阐明,我没有怎么看,主如果谈论JVM的浮点型和IEEE 754的关系的.

关于范例的别的一个需求提一下的是范例查抄.JVM盼望几近全部的范例查抄已经在运行之前完成了(普通是由编译器举行查抄的)而不用JVM自己来查抄.原始范例的值不需求被标志大概在运行时被查抄以肯定他们的范例,一样他们也不用和引用范例的值举行辨别,辨别工作是由JVM的指令集来完成的,JVM的指令集利用差别指令来辨别它要操作的值的范例,比方iadd, ladd, fadd以及dadd是用于将两个数字相加并产生数字范例后果的全部JVM指令,但是每个指令都是针对特定范例的,辨别对应int, long, float以及double.

JVM包含对对象的显式支持.类是动态分配的类实例大概是一个数组,JVM中的引用范例就是对一个对象的引用,引用范例的值可以想象为对象的指针,一个对象同时大概存在多个对它的引用,对象老是通过引用被操作、传送大概测试的.

关于引用范例,需求说起的一点就是关于null,它最初是没有运行时范例的,但是它可以被转换为任何范例,并且关于null,JVM并没有要求任何具体的值与之对应.

说完上面这些,我们就开始进入我学习JVM时最想理解的部份了,大家可要打起精神哦.

JVM为运行一个程序定义了几种数据区(Data Area),包含:pc存放器、JVM仓库、堆、办法区(Method Area)、运行经常量池(Runtime Constant Pool)以及本机办法仓库(Native Method Stacks),这些数据区按照其生存期可以分为两种,一种就是和JVM的生存期相同(包含堆和办法区),一种和线程的生存期相同(别的的),和JVM生存期相同的数据区在JVM启动的时刻被成立并在JVM退出的时刻被销毁,而和线程生存期相同的数据区是每个线程一个的,他们在线程成立的时刻被成立,在线程被销毁的时刻被销毁.

由于JVM可以同时支持运行多个线程,因此每个线程必定需求各自的PC(program counter)存放器,无论从什么角度讲,每个JVM线程只能在一个时间只能履行一个办法,该办法也就是线程的当前办法,假如该办法不是本机办法,那么PC存放器保存的就是当前指令(JVM的指令)的地址,假如是当前办法是本机办法,PC存放器的值就没有被定义.JVM的PC存放器的大小充足大,可以包容一个returnAddress范例大概特定平台的本机指针.

每个JVM线程还拥有一个私有的JVM仓库,它存储帧(下一篇文章会讲到).JVM仓库和像C这样的传统编程语言中的仓库是近似的,它保存部分变量和部份后果,并且在办法调用和返回中也担当一些职责.因为除了对帧的压入和弹出操作外,对JVM仓库不能直接举行操作,因此帧大概是在堆上分配的.假如一个线程中计算所需的JVM仓库大于答应的大小,JVM会抛出StackOverflowError错误,假如JVM仓库是可以动态伸缩的,假如需求扩大,但是又没有充足的内存可用大概没有充足的内存为一个新线程成立JVM仓库,JVM会抛出OutOfMemoryError错误.

JVM只有一个为全部线程所同享的堆,全部的类实例和数组都是在堆中成立的.堆所存储的对象被一个自动存储管理系统回收(也就是我们所熟知的垃圾汇集器(gc)).对象不能被显式的释放,JVM假定没有特定范例的自动存储管理系统,存储管理技术可以按照实现者的系统需求举行挑选.假如计算所需的内存堆大于自动存储管理系统可以利用的大小,JVM会抛出OutOfMemoryError错误.

JVM只有一个为全部的线程所同享的办法区,办法区近似传统语言的已编译代码的存储区大概UNIX进程的“文本”段.它存储类构造,比方运行经常量池,成员和办法数据以及办法、构造办法的代码(包含用于类和实例的初始化以及接口范例初始化的特定办法(这些特定办法今后会讲到)).固然从逻辑上讲办法区是堆的一部份,但是JVM的简单实现可以挑选不对办法区举行垃圾汇集大概压缩(以笔者的理解就是类不能举行卸载).最新版本(第二版)的JVM标准没有要求办法区的位置大概管理已编译代码的战略.假如办法区的内存不能满意一个分配恳求,JVM会抛出OutOfMemoryError.

运行经常量池是类文件中的常量池表的运行时表示,它包含几种常量,范围从编译时就已知的数字常量到运行时必须举行解析的办法和成员引用.运行经常量池扮演的功效近似于传统编程语言中的标记表(symbol table),但是它所包含的数据比典型的标记表更多.

每个运行经常量池从JVM的办法区中分配的,关于特定办法大概接口的运行经常量池是JVM在成立类大概接口的时刻成立的.

当成立一个类大概接口时,假如成立运行经常量池需求的内存比方法区中的可用内容更多的内存,JVM会抛出OutOfMemoryError.

关于常量池成立的更多内容今后大概会更具体的讲授.

JVM的实现大概利用传统的仓库(更普通的讲就是C栈)以支持本机办法(不是利用JAVA语言编写的办法),本机办法仓库也可以用于在像C语言这样的语言中为JVM指令集实现解析器,关于不能加载本机办法以及自身不依靠传统仓库的JVM实现而言,它可以不供应本机办法仓库,假如供应,本机办法仓库普通在线程成立的时刻为每个线程分配(以笔者的理解应当是需求利用本机办法的线程).假如线程计算所需的内存比本机办法仓库所答应的大,JVM会抛出StackOverflowError错误,假如本机办法仓库可以动态伸缩,而当需求扩大的时刻又没有充足的内存时,大概没有充足的内容用于成立一个本机办法仓库,JVM会抛出OutOfMemoryError.

关于上面的这些数据区,JVM标准答应它们的大小是固定尺寸的,也可以是按照计算的需求动态伸缩的,假如是固定尺寸的,其尺寸可以在成立时自主挑选.JVM的实现可以给程序员大概用户供应掌握JVM仓库的初始大小的办法,一样,在动态伸缩的情形下可以掌握最大大小和最小大小,并且它们所利用的内存空间可以不是持续的.


  以上是“Java虚拟机构造底子研究之一[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .