一、一些历史介绍

一个由java编写的程序和一个由c编写的程序从其源程序到最终运行的可执行程序的过程是不同的。而且,正因它的不同,使得当年跨平台运行这个特点让很多人为之兴奋,而其主要功劳归咎于虚拟机技术,也就是在java中称为jvm的家伙。在当年,它可是极大的改变了程序运行的方式。因为在以往,如使用c语言,c++等都需要通过其相应的编译器,将源程序编译成目标程序,然后该目标程序(可执行的机器语言程序)最后通过链接器链接就生成二进制的可执行文件,可以被用户调用执行。而java不同,它是通过虚拟机解释执行的,当然,在今天又诞生了更多更现代的语言,例如python,ruby等这样的动态语言,它们也是具有虚拟机(解释器)的。在上述介绍中提到了两个概念:编译器和解释器。编译器是指将源程序直接翻译成目标程序的处理程序。而解释器并不直接翻译成目标程序,而是通过将源程序编译成中间表示(如java中的字节码文件),然后再由虚拟机解释字节码执行,简单的说就是边执行边解释。从这里可以看出,在jvm最终被解释执行的是字节码,也因此使得java编译的程序具有跨平台的功能,因为在一个平台的字节码可以到另一个平台通过那个平台的虚拟机解释成机器指令执行。同时,这也使得每次执行都会重新解释一遍,这当然也对性能有一定的影响,为此提供了具有JIT(just in time)功能的编译器,这将在后续文章中具体看到。讲了那么多也算是历史的东西,该开始进入正题了,接下来将介绍jvm的基本结构以及有关字节码的知识。

二、初探jvm的基本结构

以一张图来说明jvm的基本结构: 说到底,jvm是一个虚拟机,同时它具有解释器的功能,也就是说,它可以在运行期间,加载字节码文件到内存空间,并最终翻译成机器指令或者编译成机器码运行。由上图可以看出,其实jvm开始所依赖的文件已经不是我们用编辑器编写的源代码了,而是经过编译后的.class文件,所以如何加载.class似乎成了jvm工作的起点,这在后续文章中将具体讲解类的加载机制,这里就不赘述了。而另一个重要组成部分是垃圾收集器,这也是非常强大的东西,相对于那些需要手动释放内存的语言来说,这点真的是给程序员带来了很大的便利,再也不必随时想着得记得释放哪块内存,也不必担心不幸的,不可避免的真的忘记释放了内存,导致内存泄漏,这样危险的事情发生。因此,在后续文章中也将详细了解java的垃圾回收机制。

总结

这节就大致了解了下jvm的一些基本情况,更具体的分析见后续文章~

##文档信息