深入理解Java虚拟机读书笔记之:第2章 平台无关
程序员文章站
2022-06-25 08:49:27
...
为什么要平台无关
Java技术在网络环境下非常有用,其中一个关键的理由就是,用Java创建的可执行二进制程序,能够不加改变地运行于多个平台。这一点在网络化环境中尤为重要,因为大多数网络通常都是由各种各样不同种类的计算机和设备互联而成。
此外,新兴的网络化嵌入式设备则展示了Java又一擅长的领域,因为它的平台无关性在这种环境下非常有用。在这个嵌入式的世界,Java的平台无关性也有助于简化系统管理任务。
从开发者的观点看,Java能够减少开发和在多个平台上部署应用程序的成本和时间。
Java的体系结构对平台无关的支持
对平台无关性的支持,像对安全性和网络移动性的支持一样,是分布在整个Java体系结构中的,所有的组成部分——语言、class文件、API以及虚拟机,都在对平台无关性的支持方面扮演着重要角色。
1)Java平台
Java平台扮演一个运行时Java程序与其下的硬件和操作系统之间的缓冲角色 。
无论Java程序被部署到何处,它只需要与Java平台交互,而不需要担心底层的硬件和操作系统。因此,它就能够运行于任何拥有Java平台的计算机。
2)Java语言
Java编程语言主要通过以下方式支持Java的平台无关性:它的基本数据类型的值域和行为都是由语言自己定义的。在像C或者C++这样的语言中,基本整数类型int的值域是由它的占位宽度决定的,而它的占位宽度则由目标平台决定。
通过确保基本数据类型在所有平台上的一致性,Java语言本身为Java程序的平台无关性提供了强有力的支持。
3)Java class文件
前一章曾提到,class文件定义了一个特定于Java虚拟机的二进制格式。Java class文件可以在任何平台上创建,也可以被任何平台的Java虚拟机装入并运行。它的格式,包括多字节值的高位优先存放的约定,都有严格的定义,并且是与Java虚拟机所在平台无关的。
4)可伸缩性
Java支持平台无关性,一个方面就是它的可伸缩性。Java平台可以在各种各样不同类型的(从嵌入式设备到大型主机)计算机上实现。
尽管Java目前在Web领域和桌面领域都声名卓著,但它最初却是被期望用于嵌入式设备和消费电器领域的,而不是桌面计算机。
Java三个基础API集合,它们表现Java平台不同的伸缩性:
企业版(J2EE)
标准版(J2SE)
微型版(J2ME)
在高端,企业版的存在表明了Java平台在高端服务的可用性。在中端,标准版提供了在浏览器中启动传统applet的功能和桌面环境下的Java平台。在低端,微型版通过不同的行业子集,显示了Java平台可以向下伸缩,并改变自己以适应完全不同的消费性电器市场和嵌入式系统需求的能力。
影响平台无关性的因素
Java程序的平台无关程度依赖于多种因素,其中有些因素不在开发人员的控制范围之内,但是大多数是由开发人员来控制的。从根本上说,任何Java程序的平台无关程度都依赖于作者怎样编写它。
1)Java平台的部署
决定Java程序其平台无关性的最主要因素就是Java平台在不同的平台上被部署的程度。只有在拥有Java平台的计算机或设备上,才能运行Java程序。决定Java程序平台无关性真正程度的一个重要因素——这个因素一般不是由开发人员控制的——就是已有了可用的Java平台实现和发布版本。
2)Java平台的版本
Java平台的部署有一些复杂,因为并非所有的标准运行时库在每个Java平台上都可以用的。Java平台中保证可用的基本库集合被称为标准API。Sun把Java虚拟机1.2版以及组成标准API的那些class文件称为Java 2平台标准版。这个版本的Java平台是Java API库的最小集合,例如可以在桌上型电脑和工作站上使用。
另外,Sun定义了一些标准运行时库,它把这些库作为标准版的可选项,把它们称为标准扩展API。
在理论上,只要程序仅仅依赖于标准API的运行时库,那么程序就应该可以在有Java 2平台标准版的所有计算机上运行。但在实际上,标准API的新版本要过一段时间才能在任何地方都适用。当程序依赖于标准API最新版本的一些新特性时,有些主机可能不能运行这个程序 ,因为它们只有比较老的版本。
作为一个开发人员,你不可能控制Java平台版本的发布周期或者部署进度表,但是你可以选择自己的程序所依赖的Java平台版本。
3)本地方法
除了程序所依赖的Java平台的版本之外,决定Java程序的平台无关程度的另一个主要因素就是你是否调用了本地方法。当编写一个平*立的Java程序时,必须遵守的一条最重要的原则就是:不要直接或间接调用不属于Java API的本地方法。
4)非标准运行时库
如果开发者侧重于平台无关性,那么就必须清楚地知道所使用的那些非标准运行时库是否调用了本地方法。没有调用本地方法的非标准库不会降低程序的平台无关性。然而如果使用了调用本地方法的运行时库中,那么就会产生和直接调用本地方法一样的结果——使得程序和平台相关了。
5)对虚拟机的依赖
在编写平*立的Java程序时,还必须遵从两条原则,这两条原则和Java虚拟机中的某些部分有关,Java虚拟机中的某些部分可以由不同的开发商用不同的方法实现。这两条原则是:
a)不要依赖及时终结(finalization)来达到程序的正确性。(finalize())
b)不要依赖线程的优先级(thread prioritization)来达到程序的正确性。
这两条原则可以防止Java虚拟机规范中允许的垃圾收集和线程在不同实现中的变化所带来的不利影响 。
为了保证多线程Java程序的平*立,必须依赖同步(synchronization)而不是优先级来在线程之间协调相互间的动作。
6)对用户界面的依赖
7)Java平台实现中的bug
8)测试
Java程序的平台无关性并没有达到只需在一个平台上测试它们即可的程序。
在实际情况中,在程序要运行的不同主机和不同Java平台实现上测试你的Java程序 ,是程序平台无关性的一个关键因素。
(转载请注明来源:http://zhanjia.iteye.com/blog/1841934)