深入Java虚拟机(2)——Java的平台无关性

简介:

目录(?)[+]

一、平台无关性的好处

Java技术在网络环境下非常有用,其中一个关键理由是,用Java创建的可执行二进制程序,能够不加改变地运行于多个平台。

这样的平台无关性随之带来许多的好处。这将极大地减轻系统管理员的工作;此外Java的平台无关性在嵌入式设备环境下也非常有用;从开发者的观点看,Java能够减少开发和在多个平台上部署应用程序的成本和时间。

Java的平台无关性自然不言而喻。对于我们开发者来说,可能对下面的Java是如何实现支持平台无关的方法或原理更加感兴趣。

二、Java如何实现平台无关的支持

Java对平台无关性的支持,就像对安全性和网络移动性的支持一样,是分布在整个Java体系结构中的,所有的组成部分——语言、class文件、API以及虚拟机,都在对平台无关性的支持扮演着重要角色。

2.1、Java平台

Java平台扮演一个运行时Java程序与其下的硬件和操作系统之间的缓冲角色。Java程序被编译为可运行于Java虚拟机中的二进制程序,并且假定Java API的class文件在运行时是可用的。接着虚拟机运行程序,那些API则给予程序访问底层计算机资源的能力。无论Java程序被部署到何处,它只需要与Java平台交互,而不需要担心底层的硬件和操作系统。

2.2、Java语言

Java编程语言主要通过以下方式支持Java的平台无关性:它的基本数据类型的值域和行为都是由语言自己定义的。

在像C/C++这样的语言中,基本数据类型int的值域是由它的占位宽度决定的,而它的占位宽度则由平台决定的。而Java程序,不管其运行的平台是什么,Java中的int都是32位二进制不骂表示的有符号整数,而float则总是遵循IEEE754浮点标准的32位浮点数。同样,这一点在Java虚拟机内部以及class文件中都是一致的。通过确保基本数据类型在所有平台上的一致性,Java语言本身为Java程序的无平台性提供了强有力的支持。

2.3、Java class文件

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

2.4、可伸缩性

Java支持平台无关,一个方面就是它的可伸缩性。Java平台可以在各种各样不同类型(从嵌入式设备到大型主机)的计算机上实现。

Sun改变过的API定义方式得到了三个基本API集合,它们表现Java平台的不同的伸缩性:

(1)企业版(J2EE),Java网路编程 主要用来写一些动态网站 
(2)标准版(J2SE),Core Java 简称java核心基础 主要用来写一些C/S架构的程序 
(3)微型版(J2ME),Java移动开发 主要用来开发java手机应用

三、影响平台无关性的因素

当编写Java程序时,平台无关性只是一个可选的性能。Java程序的平台无关程度依赖于多种因素,其中有些因素不在开发人员的控制范围内,但大多数是由开发人员控制的。从根本上说,任何Java程序的平也台无关程度都依赖于作者怎么编写它。

平也台无关程度影响因素有如下几点:

3.1、Java平台的部署

只有拥有Java平台的计算机或设备才能运行Java程序。设备运行Java程序前,需要做两件事,首先必须将Java平台移植到对应设备上,此外,实现接口还必须安装到对应设备上。

3.2、Java平台的版本

并非所有的标准运行时库在每个Java平台上都是可用的。作为一名开发人员,你不可能控制Java版本的发布周期或者部署进度,但是你可以选择自己的程序所依赖的Java平台。

3.3、本地方法

决定Java程序的平台无关程度的另一个主要因素就是你是否调用了本地方法。编写Java程序时,必须遵守的一条最重要的原则就是:不要直接或间接调用不属于Java API的本地方法。如果必须使用本地方法,而且要使程序可以在多种平台上运行,必须将本地方法移植到所有需要的平台上。

3.4、非标准运行库

Java平台可以由许多开发商来实现,虽然每个开发商必须提供Java API的标准运行时库,但是个别开发商还可能提供了另外的库。如果开发者侧重于平台无关性,那么就必须清楚地知道所使用的那些非标准运行时库是否调用了本地方法。如没有调用本地方法的非标准库不会降低程序的平台无关性。否则,会事程序和平台相关了。

3.5、对虚拟机的依赖

在编写平台独立的Java程序时,还必须遵从两条原则,这两条原则和Java虚拟机中的某些部分有关,Java虚拟机中的某些部分可以由不同的开发商用不同的方法实现。这两条原则是: 
1)不要依赖及时终结(finalization)来达到程序的正确性; 
2)不要依赖线程的优先级(thread prioritization)来达到程序的正确性。

这两条原则可以防止Java虚拟机规范中运行的垃圾收集和线程在不同的实现中的变化带来的不利影响。

所有的Java虚拟机都必须有垃圾收集堆,但是不同的实现可能使用不同的垃圾收集技术。在Java虚拟机规范中的这个灵活性意味着,在不同的虚拟机中,一个特定的Java程序中的对象可能在不同的时间被垃圾收集。这也意味着那些在对象被释放前由垃圾收集器运行的终结方法(finalizer),在不同的虚拟机这可能是不同的时间运行的。如果使用了一个终结方法来释放有限的内存资源,例如文件句柄,程序就可能可以在一些虚拟机的实现上运行,而在其它实现上却不能。在一些实现上,程序可能在垃圾收集器得到机会调用释放资源的终结方法之前,就已经将有限的资源耗尽了。

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

3.6、对用户界面的依赖

在不同的Java平台的实现之间 ,另一个主要的变化就是用户的接口:在编写平台独立的Java程序时,用户界面是一个更为困难的问题。用户必须利用这些基础类库建立一个接口,使许多不同平台上的用户使用起来比较舒适,这往往不是一项简单的工作。 
虽然AWT和Swing库使得创建运行在不同平台上的用户界面变得比较容易,但是它们并不一定使界面设计变得方便、界面必须使不同平台上的用户使用起来感觉到愉快。

3.7、Java平台实现中的bug

Java平台的不同实现之间还有一个变化就是bug,虽然Sun已经开发了一套全面的测试标准,Java平台实现必须通过这套标准测试。但是可能某些实现在发布的时候仍然包含bug。你只能通过测试来防止这种可能性。如果确实影响,那么就必须试图找到一个绕开的途径。

3.8、测试

因为Java平台的实现之间可能存在差异,依赖某些特定平台写的Java程序,已经在任何特定平台的实现中可能存在的bug。所以应该尽可能在所有希望运行的平台上对Java程序进行测试。在实际情况中,在程序要运行的不同主机和不同Java平台实现上测试你的Java程序,是程序平台无关性的一个关键因素。

除了上面的内容外,《深入Java虚拟机 第二版》中,关于平台无关内容还有:平台无关的七个步骤、平台无关性的策略、平台无关性和网络移动对象

对于博主目前而言,了解Java如何实现平台无关的支持和影响平台无关性的因素的内容就足够了。如果需要猿友们可以下载《深入Java虚拟机 第二版》自行学习了解。

参考书籍:《深入Java虚拟机 第二版》


相关文章
|
2月前
|
SQL 监控 数据可视化
完全开源!国内首个完全开源JAVA企业级低代码平台
JeeLowCode 是一款专为企业打造的 Java 企业级低代码开发平台,通过五大核心引擎(SQL、功能、模板、图表、切面)和四大服务体系(开发、设计、图表、模版),简化开发流程,降低技术门槛,提高研发效率。平台支持多端适配、国际化、事件绑定与动态交互等功能,广泛适用于 OA、ERP、IoT 等多种管理信息系统,帮助企业加速数字化转型。
|
29天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
Oracle 安全 Java
深入理解Java生态:JDK与JVM的区分与协作
Java作为一种广泛使用的编程语言,其生态中有两个核心组件:JDK(Java Development Kit)和JVM(Java Virtual Machine)。本文将深入探讨这两个组件的区别、联系以及它们在Java开发和运行中的作用。
92 1
|
2月前
|
SQL 安全 Java
JavaSecLab 一款综合Java漏洞平台
JavaSecLab是一款综合型Java漏洞学习平台,涵盖多种漏洞场景,提供漏洞代码、修复示例、安全编码规范及友好UI。适用于安全服务、甲方安全培训、安全研究等领域,助于理解漏洞原理与修复方法。支持跨站脚本、SQL注入等多种漏洞类型……
|
2月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
3月前
|
Java
jvm复习,深入理解java虚拟机一:运行时数据区域
这篇文章深入探讨了Java虚拟机的运行时数据区域,包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、元空间和运行时常量池,并讨论了它们的作用、特点以及与垃圾回收的关系。
75 19
jvm复习,深入理解java虚拟机一:运行时数据区域
|
2月前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
51 3
|
3月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
45 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
30天前
|
人工智能 移动开发 安全
家政上门系统用户端、阿姨端源码,java家政管理平台源码
家政上门系统基于互联网技术,整合大数据分析、AI算法和现代通信技术,提供便捷高效的家政服务。涵盖保洁、月嫂、烹饪等多元化服务,支持多终端访问,具备智能匹配、在线支付、订单管理等功能,确保服务透明、安全,适用于家庭生活的各种需求场景,推动家政市场规范化发展。
|
2月前
|
SQL 监控 数据可视化
完全开源!国内首个完全开源JAVA企业级低代码平台
JeeLowCode 是一款专为企业打造的 Java 企业级低代码开发平台,通过五大核心引擎(SQL、功能、模板、图表、切面)和四大服务体系(开发、设计、图表、模版),简化开发流程,降低技术门槛,提高研发效率。平台支持多端适配、国际化、事件绑定与动态交互等功能,广泛适用于 OA、ERP、IoT 等多种管理信息系统,帮助企业加速数字化转型。
完全开源!国内首个完全开源JAVA企业级低代码平台