本部分主要记录对JAVA体系结构的介绍
java是为网络而设计的,java的这种适合网络环境的能力是由其体系结构决定的,它可以保证安全的、健壮的和平台无关的程序通过网络传播。
Java的平台无关性可已解决网络环境中不同设备、不同操作系统、不同硬件体系带来的问题。
网络环境的安全性。Java解决这个问题的方法是,提供一个受保护的环境,从网络上下载的程序可以以不同的定制安全级别运行。安全性的另一方面是Java保证程序的健壮性。一些有害代码不会在Java中出现,比如内存泄露。这在同时提高了程序员的生产力,因为Java先天上防止了很多bug的出现,Java程序员不需要在发现和修正它们上浪费时间。
网络带来的另一个机会就是在线程序发布。Java可以利用网络的这个优点在网络上传送小段二进制代码。
可移动代码带来了另一个机会:运动的对象--它同时在网络上传送代码和状态。java实现了对象移动的诺言--通过它的对象序列化API和远程方法调用(RMI)。在java的地城结构上,对象序列化和RMI为分布式系统中的各个部分共享对象提供了基础。对象在网络上的运动型为分布式系统编程创造了新模型,有效的把面向对象编程的优点带到了网络上。
Java体系结构包括四个独立但相关的技术:
Java虚拟机和Java API组成了一个平台。
Java面向网络的核心就是Java虚拟机。
Java虚拟机的主要任务是装在class文件并执行其中的字节码。从下图可以看到,Java虚拟机包含一个类装载器(class loader),它可以从程序和API中状态class文件。Java API中只有程序执行时所需要的那些类才会被装载。字节码由执行引擎来执行。
不同的Java虚拟机中,执行引擎可能实现的不同。软件实现的虚拟机中,A.最简单的执行引擎是一次性解释字节码。B.另一种是“即时编译器”(just-in-time),执行更快,但也更消耗内存。第一次被执行的字节码会被编译成本地机器码。编译出的本地机器码会被缓存。当方法以后被调用时可以重用。C.第三种执行引擎是自适应优化器。虚拟机开始时解释字节码,同时监视运行中程序的活动,并记录下使用最频繁的代码。虚拟机只把活动最频繁的字节码编译成本地机器码,其他代码继续保留为字节码。D.最后一种虚拟机由硬件芯片构成。用本地方法执行Java字节码,这种执行引擎是内嵌在芯片里的。
有时候Java虚拟机被称为Java解释器。然而这个称谓可能会造成误导,因为不同的Java虚拟机执行字节码的方式是不同的。虽然对于直接解释字节码的Java虚拟机来说“Java解释器”是一个合理的名称,但是当讨论执行技术时,“解释”是一种易于实现而执行缓慢的特殊技术。编译型语言和解释性语言可以查看此博客描述http://fish2007.iteye.com/blog/250193。
Java中有两种方法:Java方法和本地方法。Java方法是由Java语言编写的,编译成字节码,存储在class文件中。本地方法是由其他语言(比如C,C++,或汇编语言)编写的,编译成和处理器相关的本地机器代码。本地方法保存在动态链接库中,格式是各个平台专有的。
通过本地方法,Java程序可以直接访问底层操作系统的资源。但是这种Java程序也会变成了平台相关的,使用本地方法还可能把程序变得和特定的Java平台实现相关。JNI(Java Native Interface)使得本地方法可以在特定主机系统的任何一个Java平台实现上运行。然而Java平台供应闪并不一定必须支持JNI。除了JNI之外,Java 平台供应商还可以实现自己的本地方法接口(或者按照规约要求来取代JNI)。
如果希望保证程序的平台无关性,那么只能通过Java API来访问底层系统资源。
一个Java应用程序可以使用两种类装载器:启动(bootstrap)类装载器和用户定义的类装载器。启动类装载器通常使用某种默认方式从本地磁盘中装载类,包括Java API类。
Java应用程序能够在运行时安装用户定义的类装载器。用户定义类装载器能够用Java编写,实际上只是运行中的Java应用程序可执行代码的一部分。用户定义的类装载器使得在运行时扩展Java应用程序成为可能,用户定义类装载器是使用Java编写的,所以能用任何Java代码表述风格来进行类的状态。这些被装载的类可以通过网络下载、从数据库获取,甚至可以动态生成。
每一个类被装载时,Java虚拟机都监视这个类,看它是被启动类装载器还是用户定义类装载器装载。虚拟机会使用装载第一个类的装载器装载被引用的类。
JVM这种装载类的方式,使得被装载的类只能看到被同一个类装载器装载的其他类。通过这种方法,Java体系结构允许在一个Java应用程序中建立多个命名空间,运行时的Java程序中的类装载器都有其自己的命名空间。
一个Java应用程序可以从同一个类或多个类中实例化多个用户定义类装载器。被不同的类装载器装载的类分布在不同的命名空间中,他们不能互相访问,除非应用程序显式地允许这么做。当编写一个Java应用程序时,从不同的源文件装载的类可以分隔在不同的命名空间。通过这种方法,就能使用Java类装载器的体系结构来控制从不同源文件中装载的代码之间的相互影响,特别是能防止恶意代码获取访问和破坏善意代码的权限。
此处详细描述了Java类加载器。http://www.ibm.com/developerworks/cn/java/j-lo-classloader/
Java class文件主要在平台无关性和网络移动性方面使Java更适应于网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。
在Java class文件中字节顺序是高位在前,这与使用何种平台产生这个文件和在何种平台上使用这个文件都没有关系。
Java class文件支持网络移动性。首先,class文件设计的紧凑,因此可以快速的在网络上传送。其次,由于Java程序是动态连接和动态扩展的,class文件可以在需要的时候下载。这个特点使得Java应用程序能够安排从网络上下载class文件的时间,从而可以最大限度地减少终端用户的等待时间。
Java API除了对平台无关性的推动外,在Java安全模型方面也做出了贡献。当Java API的方法进行任何有潜在危险的操作(比如进行本地磁盘读写)之前,都会通过查询安全管理器(Java1.2版本后,安全管理器的工作被访问控制器所替代)来检验是否得到授权。访问控制器是一个类,该类用来执行栈检验,以决定是否准许某种操作。
Java技术非常适用于网络,使用Java语言编程,能够充分利用如下许多软件技术:
使用Java语言最引人注目的原因之一是,能够提高开发效率,而它最主要的缺点在与执行速度较慢。这种效率的提升主要来自于Java对直接内存操作的约束。
在Java中使用对象时,需要严格遵守类型规则。将一个引用转换成别的类型是可以的。Java避免无意间破坏内存的另一个办法是自动垃圾收集。和C++一样,有个new操作符,为新对象在堆中分配内存。在Java中只需要停止对一个对象的引用,一段时间后,垃圾收集器会自动回收这个对象所占据的内存。Java在运行时保护内存的第三个方法是数组边界检查。最后一个关于Java确保程序健壮性的例子是对对象引用的检查。每次使用引用时,Java都会确保这些引用不为空值,在Java中使用一个空的引用只会导致一个异常的抛出。在C++中使用一个空指针通常会导致程序崩溃。