Java的体系结构对平台无关的支持

Java平台

  Java的体系结构通过几种途径支持Java程序的平台无关性,其中主要是通过Java平台自己。Java平台扮演一个运行时Java程序与其下的硬件和操作系统之间的缓冲角色。Java程序被编译为可运行于Java虚拟机中的二进制程序,并且假定Java API的class文件在运行时都是可用的。接着虚拟机运行程序,那些API则给予程序访问底层计算机资源的能力。无论Java程序被部署到何处,它只需要与Java平台交互,而不需要担心底层的硬件和操作系统。因此,它能够运行于任何拥有Java平台的计算机。

Java语言

  Java编程语言主要通过以下方式支持Java的平台无关性:它的基本数据类型的值域和行为都是由语言自己定义的。通过确保基本数据类型在所有平台上的一致性,Java语言本身为Java程序的平台无关性提供了强有力的支持。

Java class文件

  Class文件定义了一个特定于Java虚拟机的二进制格式。Java class文件可以在任何平台上创建,也可以被任何平台的Java虚拟机装入并运行。它的格式,包括多字节值的高位优先存放约定,都有严格的定义,并且是与Java虚拟机所在平台无关的。

可伸缩性

  Java平台可以在各种各样不同类型的(从嵌入式设备到大型主机)计算机上实现。Java 以API定义方式地道了三个基础API集合:J2EE、J2SE、J2ME。

影响平台无关性的因素

Java平台的部署

  决定Java程序其平台无关性的最主要因素就是Java平台在不同的平台上被部署的程度。只有在拥有Java平台的计算机或设备上,才能运行Java程序。

Java平台的版本

  Java平台的部署有一些复杂,因为并非所有的标准运行时库在每个Java平台上都是可用的。Java平台中保证可用的基本库集合被称为标准API。

本地方法

  除了程序所依赖的Java平台的版本之外,决定Java程序的平台无关性程度的另一个主要因素就是你是否调用了本地方法。当编写一个平台独立的Java程序时,必须遵守的一条最重要的原则就是,不要直接或间接调用不属于Java API的本地方法。

  在不需要平台无关性的情况下,可以直接调用本地方法。一般来说,本地方法在三种情况下适用:为了使用底层的主机平台的某个特性,而这个特性不能通过Java API访问;为了访问一个老的系统或者使用一个已有的库,而这个系统或库不是用Java编写的;为了加快程序的性能,将一段时间敏感的代码作为本地方法实现。

非标准运行时库

  本地方法本质上就和平台无关性不相容。重要的是你要调用的方法是否在“任何地方”都已实现。Java API在各种操作系统上的实现使用了本地方法来访问主机。当调用了Java API中的一个方法时,你就可以肯定它在任何地方都是可用的。而这个方法在某些地方是否使用本地方法实现的这个问题是无关紧要的。

对虚拟机的依赖

在编写平台独立的Java程序时,还必须遵从两条原则:

1、不要依赖即时终结(finalization)来达到程序的正确性

2、不要依赖线程的优先级(thread prioritization)来达到程序的正确性

  所有的Java虚拟机都必须有垃圾收集堆,但是不同的实现可能使用不同的垃圾收集技术。在Java虚拟机规范中的这个灵活性意味着,在不同的虚拟机中,一个特定的Java程序中的对象可能在不同的时间被垃圾回收。这也就意味着那些在对象背释放以前由拦截收集器运行的终结方法(finalizer)在不同的虚拟机中可能是在不同的时间运行的。

  在不同的Java虚拟机的实现中,另一个变化和线程的优先级有关。Java虚拟机规范只保证了,程序中所有拥有最高优先级的可运行线程将会得到一些CPU时间。这个规范也保证了在较高优先级的线程被阻塞时,较低优先级的线程将会运行。但是,在较高优先级的线程没有被阻塞的情况下,并没有禁止较低优先级的线程的运行。为了保证多线程Java程序的平台独立,必须依赖同步(sychronization)而不是优先级来在线程之间协调相互间的动作。

对用户界面的依赖

  在不同的Java平台的实现之间,另一个主要的变化就是用户的接口。在编写平台独立的Java程序时,用户界面是一个更为困难 问题。

Java平台实现中的bug

  Java平台的不同实现之间还有一个变化就是其bug。

测试

  因为Java平台的实现之间可能存在差异,依赖某些特定平台写的Java程序,以及在任何特定的Java平台的实现中都可能存在bug,所有应该尽可能在所有希望运行的平台上对java程序进行测试。

平台无关的七个步骤

  Java的体系结构允许开发者在平台无关性和其他考虑之间进行选择。编写平台无关性的程序时应遵从的七个规则:

1、选择程序要运行的主机和设备的集合

2、在目标宿主机中选择自认为足够好的Java平台版本,在该版本Java平台上编写运行程序

3、对于每个目标宿主机,选择一些程序将要运行的Java运行时环境

4、编写程序,使它只通过Java API的标准运行库来访问计算机

5、编写程序,使它不依赖垃圾收集器即时终结的正确性,也不依赖线程的优先级

6、努力设计一个用户界面,使它在你所有的目标主机上都能正常工作

7、在所有的目标运行时环境和所有的目标宿主机上测试程序

平台无关性的策略

  Java平台开发商都能以非标准的、平台相关的方式来扩展Java平台的标准组件,但是它们必须支持标准组件。所有Java平台的开发商必须签署许可证,要求保证在Java虚拟机和Java API层的相容性,但是允许在性能和扩展等领域存在差异。

平台无关性和网络移动对象

  Sun推出Java第一个版本三年后,Sun又发布了Jini。Jini试图定义一个计算机的体系结构,这个计算机是以新兴的嵌入式设备和消费性产品环境为代表的,这些设备联入一个到处存在的网络中。在支持Jini的设备中,对象通过网络在Java平台的实现之间传输,这些Java平台是在嵌入式设备或消费性产品、桌面型电脑以及服务器中的。

深入Java虚拟机读书笔记第二章平台无关性的更多相关文章

  1. 深入Java虚拟机读书笔记第一章Java体系结构介绍

    第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...

  2. 《深入理解Java虚拟机》笔记--第二章、Java内存区域与内存溢出异常

    Java程序员把内存的控制权交给了Java虚拟机.在Java虚拟机内存管理机制的帮助下,程序员不再需要为每一个new操作写对应的delete/free代码,而且不容易出现内存泄露和溢出. 虚拟机在执行 ...

  3. 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域

    深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...

  4. 深入理解Java虚拟机读书笔记3----类文件结构

    三 类文件结构 1 Java虚拟机的两种中立特性     · 平台无关性     · 语言无关性     实现平台无关性和语言无关性的基础是虚拟机和字节码存储格式(Class文件).   2 Clas ...

  5. 读书笔记,《深入理解java虚拟机》,第二章,java内存区域与内存溢出异常

    第二节,运行时数据区域.    在这个章节中,作者给出了一个java虚拟机运行时数据区的框图,图的左侧是方法区和堆,这两个数据区是所有的线程所共享的.然后是虚拟机栈.本地方法栈.还有程序计数器,这三个 ...

  6. 《深入理解java虚拟机》读书笔记-第二章Java内存区域和内存溢出异常

    java1.7和java8的jvm存在差异,本文先按照<深入理解java虚拟机>的讲解内容总结,并将java8的改变作为附录放在文末 一丶运行时数据区域 ​ 图:java虚拟机运行时数据区 ...

  7. 深入Java虚拟机读书笔记第五章Java虚拟机

    Java虚拟机 Java虚拟机之所以被称之为是虚拟的,就是因为它仅仅是由一个规范来定义的抽象计算机.因此,要运行某个Java程序,首先需要一个符合该规范的具体实现. Java虚拟机的生命周期 一个运行 ...

  8. 深入Java虚拟机读书笔记第三章安全

    为什么需要安全性 Java的安全模型是其多个重要结构特点之一,它使Java成为适于网络环境的技术.Java安全模型侧重于保护终端用户免受从网络下载的.来自不可靠来源的.恶意程序(以及善于程序中的bug ...

  9. Java Concurrency in Practice 读书笔记 第二章

    第二章的思维导图(代码迟点补上):

随机推荐

  1. unicode编码、字符的转换和得到汉字的区位码

    一:unicode编码.字符的转换截图 二:unicode编码.字符的转换代码 using System; using System.Collections.Generic; using System ...

  2. Response.End(); 用HttpContext.Current.ApplicationInstance.CompleteRequest 代替

    Response.End(); 会报异常 HttpContext.Current.ApplicationInstance.CompleteRequest 这里有个讨论的帖子很有意思:http://q. ...

  3. [JAVA关键字] synchronized

    synchronized, Example: public synchronized void XXX() {} 参考 http://wenku.baidu.com/link?url=ecb1Zivf ...

  4. 动态规划——数位dp

    通过先前在<动态规划——背包问题>中关于动态规划的初探,我们其实可以看到,动态规划其实不是像凸包.扩展欧几里得等是具体的算法,而是一种在解决问题中决策的思想.在不同的题目中,我们都需要根据 ...

  5. Multipath多路径冗余全解析

    一.什么是multipath 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,由于主机和存储通过了光纤交换机连接,这样的话,就构成了多对多的关系.也就是说 ...

  6. scipy安装失败

    pip install scipy安装失败 可以从uci网站下载wheel安装包然后执行pip install xx.whl进行安装 http://www.lfd.uci.edu/~gohlke/py ...

  7. .NET中的程序集(Assembly)

    在.NET 中,新引入了一个程序集的概念,就是指经由编译器编译得到的,供CLR进一步编译执行的那个中间产物,在WINDOWS系统中,它一般表现为.dll,或者是.exe的格式,但是要注意,它们跟普通意 ...

  8. redis学习心得之一【安装redis初体验】

    在linux下安装redis 说起这个比mysql的安装过程简单多乐,它不需要configure,只需要解压之后make就可以,无需make install ~$ wget http://redis. ...

  9. Java中sleep,wait,yield,join的区别

    sleep() wait() yield() join()用法与区别   1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”.不推荐使用. sleep()使当前线程 ...

  10. IE chrome兼容问题

    1.关于display显示和隐藏问题 document.getElementById("id").style.display="";//表示显示 documen ...