欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java体系结构介绍,java体系结构

来源: javaer 分享于  点击 11344 次 点评:59

java体系结构介绍,java体系结构


1、JAVA体系结构说明
     java体系结构包括四个独立相关的技术: java程序设计语言、 java class 文件格式、java应用编程接口、 java虚拟机。
     当编写并运行一个java程序时,就同时使用了这四种技术。用java编写源代码,把它编译成java class文件,然后在java虚拟机中运行class文件。当编写程序时,通过调用类中的方法来访问系统中资源如io、网络内存等。当程序运行的时候它可以调用class文件中的实现的方法来满足程序java api的调用。

     如图

    


     
2、JAVA虚拟机结构
     java面向web(网络)编程的核心就是java虚拟机、它坚持java面向网络体系结构三大支柱的所有方面平台无关性安全性网络移动性。
     java虚拟机是一台可以比作是一台抽象的计算器,其java api规范定义了每个java虚拟机都必须实现的特性,但是为每个特性实现都留下了很多选择。 举个例子说:虽然每个java虚拟机都必须能够执行java字节码,但是用何种技术来执行是可以选择的,比如现在使用的就是c++和c的结合。
     java虚拟机的主要任务是装载class文件并且执行其中的字节码如图:
       
      java虚拟机中包含一个类装载器也就是经常说到的class loader ,它可以从程序和API装载class文件。javaAPI中只有程序执行时需要的那些类才会被装载。字节码是由执行引擎来执行的。
      不同的java虚拟机中,执行引擎可能实现的非常不同。在由java实现的虚拟机中有三种执行引擎:一种叫“一次性解释字节码”、二种叫“即时编译器”英文just-in-time compile、三种叫“自适应优化器”。第二种比第一种执行引擎效率上要高很多,执行速度也更快,但相对的缺点就是内存消耗很大。当内存消耗剧烈的时候,jvm就会出现异常。
     在这种情况下,即时编译器第一次被执行的字节码会被编译成本地机器代码,编译出的本地机器代码也会被缓存,当方法以后被调用时候可以重用。
     第三种引擎,自适应优化器,在这种方法里,虚拟机开始的时候解释字节码,但是会监视运行种的程序的活动,并且记录下使用最频繁的代码段。程序运行时,虚拟机只把那些活动最频繁的代码编译成本地代码,其他代码由于使用的并不很频繁,继续保留字节码由虚拟机继续即时它们。一个自适应的优化器可以使用java虚拟机种的80%-90%的时间里执行被优化的本地代码,而只需要编译10%-20%对性能有影响的代码。
     最后一种虚拟机由硬件芯片构成,它本地方法执行java字节码,这种执行引擎实际上是内嵌在芯片里的。
     有时间java虚拟机被称为java解释器。然而,考虑到执行字节码的方式可能不同的这个称谓可能会存在误导,虽然对于直接解释字节码的java虚拟机来说,java解释器是一个合理的名字。但是讨论执行技术时,解释是一种我们所知道的易于实现而执行缓慢的特殊技术。因此解释器只标示是java虚拟机,并不能代表任何含义。
     当java虚拟机是由主机操作系统上的软件实现的时候,java程序通过调用本地方法native mehod 和主机进行交互。java中有两种方法,java方法和本地方法。java方法是由java语言编写,之后编译成字节码,存储在class文件中的。本地方法是由其他语言比如c\c++\汇编语言编写的,编译器和处理器的相关代码。本地方法保存在动态链接库中,格式是各个平台专有的。java方法是与平台无关的,本地方法却不是。运行中的java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。本地方法是联系java程序和底层主机操作系统的链接方法。

     如图


    通过本地方法,java程序可以直接访问底层操作系统的资源。如果是开发者这样使用,就强依赖平台了。因为本地方法中使用的类库都与平台有关。一个本地平台接口--java本地接口 java native interface .简称jni,使得本地方法可以在特定主机系统的任何一个java平台上实现运行。然而java平台的供应商并不一定必须支持jni。除了jni外。开发者还可以提供自己的本地方法接口。如果希望开发者希望使用特别主机上的资源,又无法从java api访问,那么就可以写一个平台相关的java程序来调用本地方法。如果要保证平台无关性,那么就只能通过java api 来访问底层系统资源。
3、 类装载器的体系结构
      在java虚拟机上,存在着多个类装载器,因而结构图中的类装载器方法实际标示的是一个可能包含多个类装载器的子系统。
       一个java应用程序可以使用两种类装载器,启动bootstrap类装载器和用户定义的类装载器。启动类装载器是java虚拟机实现的一部分。启动装载器通常使用默认的方式从本地磁盘中装载类,包括java api类。启动类装载器也被叫做原始类装载器、系统类装载器或者默认类装载器。
       java 应用程序能够在运行时安装用户定义的类装载器,这种类装载器能够使用自定义的方式类装载类。如图
       
     每一个类被装载的时候,java虚拟机都要监视这个类,看它到底是被启动装载器还是被用户自定义类装载器装载。当被装载的类引用了另外一个类时,虚拟机就会使用装载第一个类的类装载器装载被引用的类。举例说明如果虚拟机使用一个特定的类装载器装载了volcano这个类,它就会使用这个类装载器装载volcano类使用的所有类。如使用了一个叫lava类的一个方法,那么类装载器将动态的建立与lava类之间的关系。
     由于虚拟机采用这种方式进行类装载,所以被装载的类默认情况下只能看到被同一个类装载器装载的别的类。通过这种方式java体系结构允许java应用程序开辟多个命名空间。运行时java应用程序中的每一个类装载器都有它自己的命名空间。
    以上内容可以说,一个命名空间就是一个独立的内存体,内存与内存之间是不能通信的(这即时tomcat的核心,用户自定义的class loader,tomcat通过实现自己的class lodaer来实现不同的命名空间,装载不同的web工程)。
     一个应用程序能够从一个类或者多个类中实例化多个用户定义的类装载器,因此需要多少个用户自定义的类装载器,java应用程序就可以创建多少个。
4、java class 文件
     java class文件是一个可以跨平台的二进制文件,是通过java虚拟机来实现编译的。

5、java api
     java api是先天内嵌套在java 虚拟机平台上的。如果java 应用程序实现代码就必须先实现java api。 api调用方式如图


6、java 程序语言设计
     使用java语言进行开发时,有许多的优秀的特性,它是面向对象的、支持多线程、可以结构化处理错误(异常处理)、支持gc(垃圾收集)、可以动态链接(可以通过类装载器来装载类与类之间的关系)、可以支持动态扩展等。
          
7、java 体系结构的缺陷
     java和其他技术相比如c++和c,java程序执行的速度可能比较低,但现在虚拟机的技术也在突破,java程序的执行效率也不见得会真的比c和c++慢多少。当然即使特定的java虚拟机能够提供相当好的性能,但一般情况下,开发者还是无从选择程序在那一个java虚拟机上运行。
     那么java如何解决性能问题呢?那么可以这样做:随程序附带一种虚拟机,把程序中对时间执行严格的程序本地化实现,把整个程序编译成一个单独的执行文件,就像c和c++一样,在安装java虚拟机时可以把程序预先编译成可执行文件等等方式。
     java可以把预先编译成单独的程序来执行,但带来的缺点就是不能动态扩展了。预编译是静态链接而不是动态链接,它产生出的是一个完全链接的,单独的本地可执行文件,但是这种可执行文件通常失去了运行时动态创建和链接新类型的能力。
     java除了性能问题以外、另一个缺陷内存管理和线程序调度上的缺陷。垃圾回收可以使得许多程序更健壮,但是垃圾回收也给程序运行时带来了一些不确定性,因为开发者无法确认垃圾回收器什么时候回收垃圾,无法确认垃圾回收是否开始收集,也无法确认垃圾收集到底要持续多长时间。java虚拟机规范对线程管理非常松散,这就会导致开发者无法了解应该如何调度线程,无法控制线程调度。
    java为了实现跨平台,也是付出了一定代价的即“最小公分母问题”,因为很多特性需要开发者必须去考虑和实现,甚至有些特性是必须要实现的,这些最小公分母的选择都将会在某种程度上会对相关操作系统不友好。
   java天生就有动态链接特性,但这也牺牲了一部分东西,你看从一个类到另一个类的引用是符号化的,在静态链接的可执行程序中,类之间的引用只是直接的指针或者偏移量。相反,在java class文件中 指向了另一个类或者类的方法、属性都是需要通过特殊的声明,同时java class文件又包含了很多调试信息,这些调试信息包含了局部变量的名称和类型。这样一个class文件、以及字节码指令集和java语言之间的密切联系,都会使得java class文件逆向java源码文件,这就使得有人窃取你的源代码就相当容易。
     然而,有一种方法可以避免就是使用混淆器,混淆起可以对类名、参数等都混淆避免他人阅读源码时根据名称了解作者的意图。混淆器在国内使用非常少就不详述了。
 
8、总结
     java 的体系结构还是非常复杂和繁多的,要想对接下来的知识进一步学习,这个还是作为了解比较好的。。
    
     









相关文章

    暂无相关文章
相关栏目:

用户点评