深入Java虚拟机读书笔记第二章平台无关性
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虚拟机读书笔记第二章平台无关性的更多相关文章
- 深入Java虚拟机读书笔记第一章Java体系结构介绍
第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...
- 《深入理解Java虚拟机》笔记--第二章、Java内存区域与内存溢出异常
Java程序员把内存的控制权交给了Java虚拟机.在Java虚拟机内存管理机制的帮助下,程序员不再需要为每一个new操作写对应的delete/free代码,而且不容易出现内存泄露和溢出. 虚拟机在执行 ...
- 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...
- 深入理解Java虚拟机读书笔记3----类文件结构
三 类文件结构 1 Java虚拟机的两种中立特性 · 平台无关性 · 语言无关性 实现平台无关性和语言无关性的基础是虚拟机和字节码存储格式(Class文件). 2 Clas ...
- 读书笔记,《深入理解java虚拟机》,第二章,java内存区域与内存溢出异常
第二节,运行时数据区域. 在这个章节中,作者给出了一个java虚拟机运行时数据区的框图,图的左侧是方法区和堆,这两个数据区是所有的线程所共享的.然后是虚拟机栈.本地方法栈.还有程序计数器,这三个 ...
- 《深入理解java虚拟机》读书笔记-第二章Java内存区域和内存溢出异常
java1.7和java8的jvm存在差异,本文先按照<深入理解java虚拟机>的讲解内容总结,并将java8的改变作为附录放在文末 一丶运行时数据区域 图:java虚拟机运行时数据区 ...
- 深入Java虚拟机读书笔记第五章Java虚拟机
Java虚拟机 Java虚拟机之所以被称之为是虚拟的,就是因为它仅仅是由一个规范来定义的抽象计算机.因此,要运行某个Java程序,首先需要一个符合该规范的具体实现. Java虚拟机的生命周期 一个运行 ...
- 深入Java虚拟机读书笔记第三章安全
为什么需要安全性 Java的安全模型是其多个重要结构特点之一,它使Java成为适于网络环境的技术.Java安全模型侧重于保护终端用户免受从网络下载的.来自不可靠来源的.恶意程序(以及善于程序中的bug ...
- Java Concurrency in Practice 读书笔记 第二章
第二章的思维导图(代码迟点补上):
随机推荐
- 图论(floyd算法):NOI2007 社交网络
[NOI2007] 社交网络 ★★ 输入文件:network1.in 输出文件:network1.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在社交网络( ...
- 【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions
题目链接: http://codeforces.com/problemset/problem/710/D 题目大意: 两个等差数列a1x+b1和a2x+b2,求L到R区间内重叠的点有几个. 0 < ...
- Linked List Cycle——LeetCode
Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...
- DIV+CSS布局问题:一个宽度不确定的DIV里面放三个水平对齐的DIV,左右两个DIV宽度固定为150px,中间那个DIV充满剩余的宽度
一个入门的DIV+CSS布局问题:一个宽度不确定的DIV里面放三个水平对齐的DIV,左右两个DIV宽度固定为150px,中间那个DIV充满剩余的宽度. 说明:代码非真实情况下使用,所以直接简单. 没耐 ...
- 在VC中集成cURL
libcurl 库的代码是完全开源的,但是我们一般不会在项目中直接引入它的源代码,而是通过动态链接库隐式链接的方式引入 libcrul 库.也就是说,我们需要在自己的项目中引入 libcrul 相关的 ...
- do while 与while的区别!
#include "stdio.h" main() { ,b=; do{ //在这里do while 是先完成{}里的运算在判断while()里的循环// a=a+b; b++; ...
- 【asp.net爬虫】asp.NET分页控件抓取第n页数据 javascript:__doPostBack
最近在模拟HTTP请求抓取数据,但是服务器是asp.net开发的 分页控件代码 <tr> <td align="left">共 210&am ...
- 1.1GTK+ 的简单程序HelloWorld
1.1GTK+ 的简单程序HelloWorld 编译执行如图所看到的:
- [PWA] 0. Introduce to Offline First
Why offline first? Imagin you are visiting a website, it is fine if wifi connection is good. It migh ...
- 《Android开发艺术探索》读书笔记 (7) 第7章 Android动画深入分析
本节和<Android群英传>中的第七章Android动画机制与使用技巧有关系,建议先阅读该章的总结 第7章 Android动画深入分析 7.1 View动画 (1)android动画分为 ...