Java技术的核心就是Java虚拟机--所有的Java程序都在其上运行。

Java,除了用于描述Java程序设计语言,还需要Java虚拟机、JavaAPI、Java class文件的配置,Java程序才能运行。


Java优势:

1.用Java编写的平台无关性的程序会更容易编写、管理和维护,代价也更低。

2.安全性:提供一个受保护的环境,从网络上下载的程序可以以不同的定制安全级别运行。

3.健壮性:Java体系结构对程序健壮性有一定的保证,一些有害代码不会在Java代码中出现,比如内存泄漏。

4.在线程序发布,Java在网络上传送小段的二进制代码。

5.网络移动性:运动的对象-它同时在网络上传递代码和状态,通过对象序列化API和RMI(远程方法调用)。在Java底层结构智之上,对象序列化和RMI为分布式系统中的各个部分共享对象提供了基础。对象在网络上的运动性为分布式编程创造了新模型。


Java体系结构包括四个独立但相关的技术:

Java程序设计语言

Java class文件格式

Java应用编程接口(API)

Java虚拟机

Java虚拟机和Java API组成了Java平台

Java的面向网络的核心就是Java虚拟机,它支持Java面向网络体系结构三大支柱的所有方面:平台无关性、安全性和网络移动性。



Java虚拟机的主要任务是 装载class文件并且执行其中的字节码。

Java虚拟机包含一个类加载器(class loader),它可以从程序和API中装载class文件,Java API中只有程序执行时需要的那些类才会被装载,字节码由执行引擎来执行。


不同的Java虚拟机中,执行引擎可能实现的非常不同。

1.在有软件实现的虚拟机中,最简单的执行引擎就是一次性解释字节码。

2.“即时编译器”(just in time compiler),执行引擎更快,但是也要消耗内存,

第一次被执行的字节码会被编译成本地机器代码,编译出的本地机器代码会被缓存,当方法以后被调用时可以重用。

3.自适应优化器,虚拟机开始的时候解释字节码,但是会监视运行中程序的活动,并且记录下使用最频繁的代码段,程序运行的时候,虚拟机只把那些活动最频繁的代码编译成本地代码,其他的代码继续保留为字节码-由虚拟机继续解释它们。一个自适应的优化器可以使得Java虚拟机在80%~90%的时间里执行被优化过的本地代码,而只需要编译10%~20%对性能有影响的代码。该虚拟机由硬件芯片构成,它用本地方法执行Java字节码,这种执行引擎实际上是内嵌在芯片里的。


当Java虚拟机是由主机操作系统上的软件实现的时候,Java程序通过调用本地方法(native method)和主机交互。

Java有两种方法:Java方法和本地方法

1.Java方法是由Java语言编写,编译成字节码,存储在class文件中的。

2.本地方法是由其他语言 编译成和处理器相关的机器代码。保存在动态连接库中,是与平台相关的。

运行中的Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。

本地方法是联系Java程序和底层主机操作系统的连接方法。


通过本地方法,Java程序可以直接访问底层操作系统的资源。

一个本地方法接口--Java本地接口(Java Native Interface,JNI)--使得本地方法可以在特定主机系统的任何一个Java平台上实现运行。

然而Java平台供应商不一定必须支持JNI。



类装载器的体系结构

一个Java应用程序可以使用两种类加载器:启动(bootstrap)类加载器和用户定义的类装载器。

启动类装载器(这是系统中唯一的)是Java虚拟机实现的一部分,通常使用某种默认方式从本地磁盘中装载类,包括Java API。


Java应用程序能够在运行时安装用户定义的类加载器,这种类加载器能够使用自定义的方式装载类,

启动类装载器是虚拟机实现的本质部分,而用户定义的装载器不是;

但用户定义的类装载器能够用Java编写,能够被编译为class文件,能够被虚拟机装载,还能实例化,它们实际上只是运行中的Java应用程序可执行代码的一部分。


用户定义的类装载器使得在运行时扩展Java应用程序成为可能。

当它运行时,应用程序能够决定它需要哪些额外的类,能够决定是使用一个或是更多的用户定义的类装载器来装载。

由于类装载器是使用Java编写的,所以能用任何在Java代码中可以表述的风格来进行类的装载。这些类可以通过网路下载,可以从某些数据库中获取,甚至可以动态生成。


每一个类被装载的时候,Java虚拟机都监视这个类,看它到底是被启动类装载器还是被用户定义类装载器装载。

当被装载的类引用了另外一个类时,虚拟机会使用装载第一个类的类装载器装载被引用的类。


被装载的类默认情况下只看到被同一个类装载器装载的别的类。

通过这种方法,Java的体系结构允许在一个Java应用程序中建立多个命名空间,

运行时的Java程序中的每一个类装载器都有它自己的命名空间。


Java class文件

为Java程序提供独立于底层主机平台的二进制形式的服务


Java API 

运行库的集合,它提供一套访问主机系统资源的标准方法。

编写Java程序时,可以假设在任何可运行程序的java虚拟机上都能够获取Java API class文件。

所有被装载的class文件(包括从应用程序中和从Java API中提取的)和所有已经装载的动态库(包含本地方法)共同组成了在Java虚拟机上运行的整个程序。


在一个平台能够支持Java程序以前,必须在这个特定平台上明确地实现API功能。

为访问主机上的本地资源,Java API调用了本地方法,所以Java程序就不需要再调用它们了。

通过这种方法,Java API class文件为底层主机提供了具有平台无关性、标准接口的Java程序。

对于Java程序而言,无论平台内部如何,Java API都会有同样的表现和可预测的行为。

正是由于在每个特定的主机平台上都明确地实现了Java虚拟机和Java API,因此,Java程序自身就能够成为具有平台无关性的程序。


当Java API的方法进行任何有潜在危险的操作(比如进行本地磁盘写操作)之前,都会查询安全管理器来检验是否得到了授权。

安全管理器是一个为应用程序提供自定义安全策略的特殊对象。


Java程序设计语言

使用Java语言编写程序,能够充分利用如下软件技术:

1.面向对象

2.多线程

3.结构化错误处理

4.垃圾收集

5.动态连接

6.动态扩展

Java语言能够提高开发者的效率,但执行速度较慢

面向对象,提升代码的重用率,提高开发者的效率。

这种效率的提升主要来自Java对直接内存操作的约束。


与C++不同,在Java中,没有通过使用强制转换指针类型或者通过指针运算直接访问内存的方法。

在Java中使用对象时,需要严格地遵守类型规则。

在Java中,将一个引用转换成别的类型是可以的,但只能在此对象的确为这种新类型的前提下才能进行。

由于Java在运行时强制执行严格的类型规则,根本无法以可能导致内存冲突的方式直接管理内存。


Java避免无意间破坏内存的另一个办法是自动垃圾收集

Java通过new来为新对象在堆中分配内存,但是没有与new对应的delete操作符。

在Java中要停止对一个对象的引用,一段时间后,垃圾收集器会自动回收这个对象所占据的内存。


垃圾收集器禁止Java程序员显示指明哪个对象应该被释放

如果不再使用的对象没有被释放,会导致内存泄漏;多次释放一个对象会导致内存冲突。


Java在运行时保护内存完整性的第三个办法是数组边界检查


最后一个关于Java确保程序健壮性的例子是对对象引用的检查,每次使用引用的时候,Java都会确保这些引用不为控制


管理单独应用程序性能的最有效途径,可能就是自主选择虚拟机了,某些情况下,把可执行部分或者整个程序本地话也许是最佳的解决途径。


把Java程序编译成单独的可执行程序的方法(预编译)能够改善性能,但这通常是以牺牲Java的动态扩展能力为代价的。

预编译是进行静态而不是动态的连接,它产生出完全连接的、单独的本地可执行文件,但是这种可执行文件通常失去了运行时动态创建和连接新类型的能力。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐