对于Java,我们首先需要知道Java的体系结构,总体来说,它由4部分组成1、java程序设计语言:这就是我们通常编码时写的代码。2、java class文件:源码编译后的二进制字节码文件,后缀名.class的文件。3、java API:就是JDK中自带的那些java代码,其介于开发人员编写的代码与底层操作系统资源之间的中间层。4、java虚拟机:用来装载class文件并且执行其中的字节码。
一、Java虚拟机
前面讲到,java虚拟机的主要任务就是加载class文件并且执行其中的字节码,其与Java API合在一起就是我们所谓的“Java 平台”,或者"Java运行时环境"。
Java虚拟机主要由类装载器子系统和字节码执行引擎两部分组成。
1、类装载器子系统,顾名思义,就是用来负责定位并加载class文件的,目前依据继承层次主要分为:启动类装载器(BootstrapClassLoader)、标准扩展类装载器(ExtClassLoader)、类路径类装载器(AppClassLoader,也叫系统类装载器)以及用户自定义类装载器。类装载器装载类时,都是在JVM第一次需要执行该类字节码时发生,即我们所谓的"延迟加载"机制。
2、字节码执行引擎,即将Java字节码翻译为本地机器码的模块。目前执行引擎主要分为四类:
(1) 一次性解释字节码:即为当JVM执行某段字节码时,由执行引擎将其翻译为本地机器码,当再次执
行到该段字节码时,再次由执行引擎翻译为本地机器码。
(2) JIT(即时编译器):在(1)的基础上,将翻译后的本地机器码缓存起来,当再次执行时,就不需要再次
翻译了。当然,该种执行引擎会占用更多的内存。
(3) 自适应优化器:JVM会监视所有字节码的执行频率,将那些常用的字节码所对应的本地机器码缓存
起来。
(4) 硬件芯片:由本地方法执行Java字节码,但是这些本地方法是被固化在芯片中。
二、类装载器
前面已经提到过,Java类装载器主要分为四种:启动类装载器(BootstrapClassLoader)、标准扩展类装载器(ExtClassLoader)、类路径类装载器(AppClassLoader,也叫系统类装载器)以及用户自定义类装载器。那么这四类不同的装载器区别是什么?这里先不赘述。
但是这里比较重要的一点就是,JVM对不同的类装载器[对象]定义了不同的命名空间,而且不同命名空间里的类对象是彼此不可见的,不能彼此相互访问(除非应用程序显示地要求这么做)。那么这句话到底怎么理解呢?假如类装载器A(对象)装载了类Hello A,并且类装载器B(对象)也装载了类Hello B,那么其实对于这两个Hello类对象而言,他们并不知道对方的存在,更不能相互访问,因为他们属于两个不同的命名空间A和B。而且,对于JVM来说,这两个Hello类对象也是属于两个完全不同的类对象,因为对于JVM来说,只能由 类装载器[对象](命名空间)和类完全限定名 才能唯一标识一个类对象。
另外,需要我们记住的一点就是,同时依然是上面一句话的延伸,即:类及该类所引用的其他类必然属于同一个命名空间,即该类所引用的其他类必然会被装载第一个类的装载器[对象]来装载。比如类Hello A被装载器A装载到了JVM中,但是该Hello A类同时引用了类Hello B,那么Hello B类也同时会被装载器A加载到JVM中,如此以来,Hello A和Hello B之间才能可见,才能相互访问。换句通俗话来讲,当被装载的类引用了另外一个类,那么JVM就会用装载第一个类的装载器[对象]来装载被引用的类。
如此设计的类装载器模型,可以有效地防止不同代码间的相互侵占,相互破坏。
三、Java Class文件
在Java Class文件中,字节顺序是 高位在前 ,这 一点希望大家要谨记。
四、Java API
Java API的class文件天然就是与平台相关的,其处于Java程序与本地代码中间这一层,但是正是由于有了Java API这一层,才致使我们编写的Java代码是与平台无关的。
同时,Java API中提供了安全性模型。安全管理器正是这样一个为应用程序提供自定义安全策略的对象,例如,安全管理器可以禁止对本地磁盘的非法访问。然后在Java1.2中,安全管理器被访问控制器所取代,该类用来执行栈检验,以决定是否准许某种操作。