当前位置:首页 > 虚拟机 > 正文

深入理解java虚拟机看不懂(深入理解jvm虚拟机 第三版)

为什么要学习java虚拟机的使用?

随着编程行业和互联网的不断发展,越来越多的编程开发语言被程序员掌握。今天昌平Java培训就来学习一下Java虚拟机在学习Java编程开发语言时的作用。


程序员的语言这不是一个有争议的案件。系统语言编写者鄙视托管语言的低性能效率;托管语言编写者嘲笑系统语言中手动内存管理的必要性;动态语言编写者鄙视该语言冗余的静态类型系统;静态语言编写器模拟动态语言内部结构各种奇怪的运行时错误。


Java作为一种广泛使用的语言,自然吸引了很多攻击。作为一名Java程序员,你可能在口水战中输了,怨恨自己没有足够的知识来武装自己,又或许想深入学习Java语言却不知如何开始,头在哪里来自?事实上,我什至对Java的启动性能和内存消耗感到震惊,因此我对Java语言本身产生了很多怀疑和担忧。


不过不用担心,学习Java虚拟机可以解答你所有关于Java的疑问并“知其所以然”——理解Java程序是什么?如何是否已完成并优化?这样,你就可以从内部开始,达到编程效率。同时,还可以为学习核心、更深层次的Java技术打下坚实的基础。


如果把核心类库API比作一个数学公式的话,那么Java虚拟机的知识就像一个公式的推导过程。掌握数学公式固然可以帮助你通过考试,但了解其背后的导数过程对记忆和理解更有帮助。而且,当我们遇到没有公式的情况时,我们也能知道如何解决。


深入理解java虚拟机应届生需要理解到什么程度
从进程的角度解释JVM
我们尝试从操作系统层面来理解虚拟机。我们知道虚拟机运行在操作系统中,那么操作系统中可以运行什么呢?当然是进程,因为进程是操作系统中的执行单位。可以理解为,当它运行时,它是操作系统中的一个进程实例;当它不运行时(作为可执行文件存储在文件系统中),它可以称为程序。
熟悉命令行的同学都知道,命令实际上就相当于一个可执行的二进制文件。当您键入此命令并按Enter键时,将创建一个进程,相应的可执行文件会将.file加载到进程的地址空间中并执行其中的指令。我们通过比较C语言和Java语言的HelloWorld程序来说明问题。
首先编写C语言版本的HelloWorld程序。
[cpp]viewplaincopy
#include
#include
intmain(void){
printf("helloworld\n");
return0;
}
编译C语言版本的HelloWorld程序:
[plain]viewplaincopy
gccHelloWorld.c-oHelloWorld
运行C语言版本的HelloWorld程序:
[plain]viewplaincopy
zhangjg@linux:/deve/workspace/HelloWorld/src$./HelloWorld
helloworld
gcc编译器编译出来的文件直接是操作系统可以识别的二进制可执行文件。当我们在命令行输入./HelloWorld执行这​​个命令时,直接创建了一个进程,并将可执行文件加载到进程的地址空间中,并执行文件中的指令。
为了进行比较,我们看一下Java版本的HelloWord程序的编译和执行情况。
首先编写源文件:
[java]viewplaincopy
publicclassHelloWorld{
publicstaticvoidmain(String[]args){
n("HelloWorld");
}
}
编译Java版本的HelloWorld程序:
[java]viewplaincopy
zhangjg@linux:/deve/workspace/HelloJava/src$
zhangjg@linux:/deve/workspace/HelloJava/src$ls

运行Java版本的HelloWorld程序:
[plain]viewplaincopy
zhangjg@linux:/deve/workspace/HelloJava/src$orld
HelloWorld
从上面的过程可以看出,当我们运行Java版的HelloWorld程序时,命令并不是./。因为类文件不是操作系统可以直接识别的二进制可执行文件。我们写的是java命令。这个命令表明我们首先启动的是一个名为java的程序。运行后,这个java程序就成为了一个JVM进程实例。
上述命令执行流程如下:
Java命令首先启动虚拟机进程。虚拟机进程启动后,读取参数“HelloWorld”并将其作为初始类加载到Memory中,初始化并动态链接该类(该类的初始化和动态链接将在后面的博客中介绍),然后从该类的main方法开始执行。也就是说,我们的.class文件并不是直接被系统加载并直接运行在CPU上,而是托管在一个叫做虚拟机的进程中。首先要启动虚拟机进程,然后虚拟机中的类加载器加载必要的类文件,包括jdk中的基本类(如String和Object等),然后虚拟机进程解释该类字节码指令并设置它们这些字节码指令被翻译成本机CPU可以识别的指令,然后才能在CPU上执行。
从这个角度来说,当你运行一个所谓的java程序时,真正运行的是一个叫做Java虚拟机的进程,而不是我们写的class文件。这个称为虚拟机的进程处理一些低级操作,例如内存分配和释放等。我们编写的类文件只是虚拟机进程执行所需的“原材料”。这些“原材料”在运行时被加载到虚拟机中,由虚拟机解释执行,控制虚拟机实现我们java代码中定义的一些比较高级的操作,比如创建文件等。add信息被认为是虚拟机的控制信息,是虚拟指令的一种。