有人说最好的学习是输出。
Java体系结构包括四个独立但相关的技术
- Java程序设计语言
- Java class文件格式
- Java应用编程接口(API)
- Java虚拟机
当编写并运行一个Java程序时,就同时体验了这四种技术。用Java编程语言编写源代码,把他编译成Java class文件,然后再在Java虚拟机中运行class文件。当编写程序时,通过调用类(这些类实现了Java API)中的方法来访问资源(比如I/O)。
Java虚拟机和Java API一起组成了一个“平台”,所有Java程序都在这上面编译。Java虚拟机和Java API的组合除了被称为Java运行时系统外,还被称为Java平台。
Java虚拟机
Java虚拟机的主要任务是装载class文件并且执行其中的字节码。Java虚拟机包含一个类装载器(class loader),它可以从程序和API中装载class文件。Java API中只有程序执行时需要的那些类才会被装载。
字节码由执行引擎来执行。
Java API
Java中有两种方法:Java方法和本地方法。Java方法是由Java语言编写,编译成字节码,存储在class文件中。本地方法是由其他语言(c,c++或者汇编)编写的,编译成和处理器相关的机器代码。本地方法保存在动态链接库中,格式是各个平台特有的。
运行中的Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库
如果希望使用指定主机上的资源,他们又无法从Java API访问,那么可以编写一个平台相关的Java程序来调用本地方法接口(JNI)-----Java调用本地方法其实是通过JNI方式调用本地方法,这样使得本地方法可以在特定主机系统的任何一个Java平台上实现。
然而Java平台供应商并不一定必须支持JNI。除了JNI之外,他们还可以提供自己的本地方法接口。
如果希望保证程序的平台无关性,那么只能通过Java API来访问底层系统资源。
Java class文件
Java class文件是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件
Java class文件中字节顺序是高位在前,这与使用何种平台产生这个文件和在何种平台上使用这个文件都没有关系。
Java程序设计语言
使用Java语言编写程序,能够充分利用如下的许多软件技术:
- 面向对象
- 多线程
- 结构化错误处理
- 垃圾收集
- 动态连接
- 动态扩展
Java体系结构的代价
- Java程序的执行速度
- 内存管理
- 线程调度
- Java动态链接特性
Java程序的执行速度
解释器:每次解释一条字节码,简单,性能不高
即时编译器:
第一次被执行的字节码会被编译成本地机器代码。编译出的本地机器代码会被缓存,当方法以后被调用的时候可以重用
自适应优化器:
(虚拟机开始的时候解释字节码,但是会监视运行中程序的活动,并且记录下使用最频繁的代码段。程序运行的时候,虚拟机只把哪些活动最频繁的代码编译成本地机器代码,不频繁的代码继续保留为字节码-----由虚拟机继续解释它们)
内存管理
垃圾收集器可以使得许多程序更加健壮,但是垃圾收集器也给程序运行时的性能加入了一些不确定性,你无法确认垃圾收集器什么时候开始收集,无法确认垃圾收集器是否开始收集垃圾,也无法确认垃圾收集器到底要持续多久。
线程调度
Java虚拟机规范讨论线程调度的地方非常笼统,程序员无法了解应该如何调度线程,无法控制线程的调度。
动态链接特性
因为Java程序是动态连接的,从一个类到另一个类的应用是符号化的。在Java class文件中,指向另一个类的引用通过字符串清除的表明了所指向的这个类的名字。如果引用是指向一个字段的话,这个字段的名字和描述符(字段的类别)会被详细说明。如果引用指向一个成员方法的话,那么这个成员方法的名称和描述符(方法的返回类型,方法参数的数量和类型)也会被详细说明。而且,Java class文件除了对其他类的字段和成员方法的符号引用,他们还包含对自己的字段和成员方法的符号引用。Java class文件还包含可选的调试信息,这些测试信息包含局部变量的名称和类型。
一个class文件的符号信息,以及自己吗指令集和Java语言之间的密切关系,这些方面都使得把Java class文件逆向编译为Java源码文件相当容易。
以上内容大部分来源于《Inside the Java Virtual Machine ,Seconde Edition》