我们在电脑上写好的一个Java文件(*.java)是怎样被JVM(Java虚拟机)加载和使用的呢?这样一个原理性的问题,如果要追根溯源,恐怕我说个三天三夜也说不完。我们本文的目的就如标题所讲--------深入浅出,力求简洁明了,你懂的。
1.有关JVM
JVM是Java语言的核心机制之一。英文全称Java Virtual Machine。是Java程序的字节码(*.class)的运行环境。同样也是Java语言跨平台运行的必要条件。可以说,正是由于JVM的存在,才造就了Java语言跨平台的特性。
此话怎讲?JVM是java应用程序和操作系统(Unix,WinXP等)的中间层。java应用程序面对的是运行在具体操作系统上的JVM。我们不妨将JVM想象成翻译,我们(java应用程序)对翻译(JVM)说话,翻译会将话翻译给相应的外国人(具体的操作系统)。至于中间怎么翻译,我们可以不用理会。
- *.java----------------->*.class------------------>JVM--------------------->操作系统平台
那么我们来简单了解一下这个翻译的过程。
JVM主要由类加载器(classLoader),字节码校验器,类解释器(InterPreter)组成。我们把前面的图再加工一下,你就能大致明白这三者在整个翻译过程中的作用。
- *.class-------------------->类加载器----------------(a)--------------->字节码校验器-------------(b)---------->类解释器-----------(c)-------->操作系统平台
注意,由上图我们能看出,类加载器在翻译过程中首先出场,然后是字节码校验器,最后类解释器登场,完成翻译工作。
对应注释,我们来详细了解下整个过程。
(a)类加载器读取java字节代码,并转换成java.lang.class类的实例。每个java类都维护这一个指向它的类加载器的引用。我们可以通过getClassLoader获取。
(b)字节码校验器检查.class文件内部结构,检查是否符合语言特征的编译规则。
(c)类解释器翻译成各相应平台的机器语言。
同时,JVM还在运行过程中进行着java安全性检查,比如类型安全的引用转化,GC,数组边界检查,NullPointer检查等。
总结来说,就是JVM屏蔽了底层运行平台的差别,实现了一次编译,随处运行。所以,Java是一种解释型语言。