关闭

第一章 java结构介绍

标签: javaclass虚拟机平台c++api
570人阅读 评论(0) 收藏 举报
一、环境下的机遇与挑战
      网络的快速发展给现代变成语言提出了新的挑战和机遇,而作为新生语言的java提供了三种机制来应对这种变化,他们是:
     1、平台独立
     2、安全(网络安全,语言安全)
     3、网络移植
二、Java体系的组成
     我们所说的Java技术实际上包含了四个独立而又紧密联系的四个部分:
     1、Java编程语言
     2、Java虚拟机
     3、Java Class文件格式
     4、Java API
三、Java环境
     Java虚拟机和Java API都是独立于每个特定平台的,所有他们也被称为“Java平台(Java Platform)”,而除此之外的就被称为“Java运行时系统(Java runtime system)”
四、Java虚拟机
     Java虚拟机是Java技术体系中的核心,他是其他三项技术实现的基础。他构成了一个虚拟的计算环境,为每个Java程序提供了一个确定的执行环境。
     Java 虚拟机的主要工作就是加载Java Class文件,并执行中包含的字节码。正如图1-3所示,每个Java虚拟机都包含一个Class Loader,他负责加载所有的Class File,他负责加载自己程序的和Java API的两种Class File。只要是程序运行需要的Class文件都会被加载都Java虚拟机中。
     字节码在execution engine中被执行,它在不同的Java虚拟机中可能会有不同的实现。在一个由软件实现的Java虚拟机中,最简单的实现就是逐个的解释每个字节码。也 有一种比较快,但是也需要更多内存的实现:及时编译(just-in-time compiler)。在这种实现中,当一个方法被初次调用时被编译为本地机器码(native machine code),执行后会被缓存,但再次调用这个方法时直接执行缓存中的机器码。
有时Java虚拟机也会被称为“Java解释器(Java interpreter)”,这个名词很容易让人误解,Java虚拟机只是解释字节码为本地机器码,可是在Java虚拟机有时会有不同的实现,比如及时编译(just-in-time compiler)。
     Java 也提供了一种直接方法本地系统资源的本地方法(native methods),并且提供了一种本地方法接口(Java Native Interface, or JNI),他可以让本地方法可以和Java平台一起工作。但是,当你是用本地方法时,程序就成为系统关联(platform-specific),丢失了 系统独立的属性。所有如果你想让你的程序独立于系统,你就应该完全用Java来实现你的程序。
五、Class Load的体系结构
     Java 虚拟机中的Class Load结构是Java的安全性和网络可移植性的保证。一个Java程序能够使用两种Class Loader:一种是原始ClassLoader("primordial" class loader),一种是class loader objects。
     1、原始Class Loader(("primordial" class loader):它是Java虚拟机实现的一部分,原始Class Loader通常从本地磁盘加载被信任的Class,包括Java API的Class。
     2、 类加载器(class loader objects):它不是Java虚拟的一部分,可以用Java语言实现。所有原始Class Loader加载的Class,Java虚拟机总是认为它是被信任的,而由类加载器加载的类,Java虚拟机认为它是不被信任的。
     无论是原始Class Loader还是类加载器(class loader objects)加载的类,都会被Java虚拟机跟踪。当一个类第一次使用另外一个类时,他会使用加载本身这个类的Class Loader来加载这个类。
每 个类在默认情况下只能看到由同一个Class Loader加载的其他类。正是这种机制,可以让你在一个Java程序中使用多重命名空间(name-spaces)。每个Class Loader维护自己的命名空间。通过这个方法也可以让你的程序将程序的各个部分隔离,比如将敌方的代码和友方的代码隔离。
六、The Java Class File
     Java Class File的设计非常好的支持了Java技术的平台独立性和网络可移动性,他将Java程序编译成为一种Java虚拟机可识别,而由不依赖于本地机器环境的二进制格式。Java Class File的有如下三个特点:
     1、动态连接。所有依赖于平台的实现,均由Java虚拟机执行时动态连接
     2、独立于平台的字节码。Java Class File中始终都使用big-endian编码格式。
     3、紧凑的文件结构。让Class文件更小,更容易传输。
七、The Java API
     Java API也是Java平台独立和安全性的重要保证。Java API是特定于实现平台的,Java API往往通过本地方法来访问系统资源。
     Java API本身的实现也体现了平台独立性。比如Java图形接口就是通过访问AWT(Abstract Windows Toolkit),来为Java程序提供一个独立于平台的统一界面。
     Java API不仅仅实现了平台独立性,而且也为Java的安全性提供了很好的支持。Java API在作任何可能危害系统的事情时(比如写磁盘),总会通过安全管理器(security manager)来检查许可证。安全管理器(security manager)容许Java程序实现自己的安全策略,比如禁止写磁盘。通过实现安全管理器(security manager),程序可以很好的控制那些非安全代码。
八、The Java Programming Language
     虽然Java语言是为了网络程序而设计的,但是他的运用不仅仅限于网络。Java语言本身提供了很多其他的软件技术,有:
     1、面向对象
     2、多线程
     3、错误处理
     4、动态连接
     5、动态扩展
     6、垃圾收集
     Java语言有很多优点和缺点,最明显的优点是他能够提升程序员的生产力,而缺点就是有点慢。
首先Java是一门面向对象的语言,他提倡重用,这点就比其他过程语言(如C)大大提升了生产力。而和C++相比,Java也有很多特点来改善生产力,最突出的就是:
     1、限制了直接内存操作。
     2、就是垃圾收集。
     3、永远的边界检查,最好的例子就是Null变量的检查,在C++中他会导致  程序的崩溃,而在Java中他只是抛一个异常。
     这些特征保证了Java的更高生产力,更短的开始周期,更低的开发投入。但是他们也是Java慢的原因:
     1、永远的边界检查,永远的类型检查,永远的Null检查,永远的垃圾收集这些都是Java程序要比C++慢,但是相对于程序的开发效力,我认为这些还是值得的,毕竟最总用户并一定不能感觉到这种速度。
     2、 作为一种解释型语言,Java在速度上要落后C++许多。C++编译时将程序直接转换为可以直接执行器码,而Java必须将程序翻译为独立于平台的字节 码。这使由Java虚拟机执行的Java字节码,要比C++编译的代码慢10-30倍。但是,你可以将Java程序编译为特定平台的机器码,这样可以让程 序快许多,只是丢失了平台独立的特性。不多及时编译技术(just-in-time)可以弥补一点速度上的损失,那能够将速度上的差距缩短到7-10倍。 在大多数情况下,通过及时编译达到的速度已经能过满足最终用户的要求了。
九、Java体系结构的代价
     Java是一网络为导向设计的体系结构,这种体系结构为Java带来了很多的优点。但是,我们也必须为这些优点付出代价。当Java的设计者面对一个问题的时候,他们总是将设计偏向了网络这一边,这导致Java并不能解决所有的问题。
     1、速度:至少有如下的这些特性降低了Java程序的执行速度:
          1)、解释执行字节码,让Java程序比机器码程序慢了10-30倍。
          2)、及时编译,虽然能过提升7-10倍的执行速度,可是依然要比机器码慢
          3)、Java是动态连接的
          4)、Java虚拟机可能要去等待从网络上下载Class文件。
          5)、永远的数组边界检查
          6)、所有新建的对象都存放在堆中(不是放在堆栈中)
          7)、所有对象变量在运行时判断是否为Null
          8)、所有对象变量在运行时判断是否类型安全
          9)、垃圾收集往往没有在C++中直接控制来的有效
          10)、所有的原始类型都是独立于平台(这意味在执行时需要转换),而不是像C++中直接依赖于平台。
          11)、Java中所有的字符串都编码为UNICODE,而不是像C++中操作ASCII码。
应为这些导致Java程序即使编译为本地机器码不会像C++程序那样快,这是的Java不适合解决那些对速度要求非常苛刻的系统。
     2、对内存的直接控制:垃圾收集可以让程序员有更多精力处理业务逻辑,更容易学习,但是这也让程序员放弃了对内存的直接控制。放弃了对内存的直接控制,让Java不适合处理实时问题。毕竟多数实时系统也不在乎什么平台独立性什么的。。
     3、 平台独立性:Java API必须保证在不同的系统上有一致的行为,这就要求Java API只能实现所有系统的最小公分母(lowest-common-denominator)。这种最小公分母的选择可能会使程序员和最终用户在不同程度 上所到不同操作系统的影响。
     4、动态连接:它使得Java必须用描述符(descriptor (the fieldís type))来实现连接,而不是像静态连接那用是用指针。这样Java Class 文件中必须保存不够的描述符要支持这种动态连接,这让Java Class文件更容易被反编译。可能你的对手只要花很少的代价就可以看到你辛辛苦苦写的代码。不过你可以混乱(obfuscate)的代码,让你的对手不 是那么容易取得你的代码。混乱(obfuscate)改变了Class文件里边的类名、字段名、方法名,但是不该点所作的操作。
十、展望
     热点编译,将程序花费程序80%运行时间的程序优化,编译为本地代码。
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:29404次
    • 积分:445
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:13篇
    • 译文:0篇
    • 评论:70条
    文章分类
    最新评论
    网络技术