深入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 读书笔记 第二章
		
第二章的思维导图(代码迟点补上):
 
随机推荐
- HDOJ(HDU) 2135 Rolling table
			
Problem Description After the 32nd ACM/ICPC regional contest, Wiskey is beginning to prepare for CET ...
 - Jack Straws(判断线段是否相交  + 并查集)
			
/** http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1840 题意: 判断线段 ...
 - [Locked] One Edit Distance
			
One Edit Distance Given two strings S and T, determine if they are both one edit distance apart. 分析: ...
 - Linus:为何对象引用计数必须是原子的
			
Linus大神又在rant了!这次的吐槽对象是时下很火热的并行技术(parellism),并直截了当地表示并行计算是浪费所有人时间(“The whole “let’s parallelize” thi ...
 - 利用组策略禁用Oultook 各个版本的缓存模式!
			
由于缓存模式有些自己特性和企业内的管理策略原因,有些用户不希望使用缓存模式来使用Outlook.我们怎么才能禁用缓存模式呢?请参考如下做法: 首先我们从网站上下载Office 相应的管理adm软件,这 ...
 - sql给整数补零
			
update hs_user.clientorder a set a.stockcode = lpad(a.stockcode,6,'0') where a.market = 'SZ'
 - 【转载】运维小技巧:使用ss命令代替 netstat
			
转自:https://www.91ri.org/12470.html ss是Socket Statistics的缩写. 顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类 ...
 - 为什么使用spring Struts 等框架开发
			
转载自:http://www.cnblogs.com/sharpxiajun/p/3936268.html 今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入, ...
 - 你好,C++(12)怎样管理多个类型同样性质同样的数据?3.6 数组
			
3.6 数组 学过前面的基本数据类型之后,我们如今能够定义单个变量来表示单个的数据.比如,我们能够用int类型定义变量来表示公交车的216路:能够用float类型定义变量来表示西红柿3.5元一斤. ...
 - When does layoutSubviews get called?
			
转自:http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/ It’s important to optim ...