Java虚拟机是什么
2022-03-31 09:50:59 19
Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。那么大家知道Java虚拟机是什么呢?下面一起来看看!
什么是Java虚拟机
作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的。但是如果要问什么是虚拟机,恐怕很多人就会模棱两可了。在本文中,我会写下我对虚拟机的理解。因为能力所限,可能有些地方描述的不够欠当。如果你有不同的理解,欢迎交流。
我们都知道Java程序必须在虚拟机上运行。那么虚拟机到底是什么呢?先看网上搜索到的比较靠谱的解释:
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
这种解释应该算是正确的,但是只描述了虚拟机的外部行为和功能,并没有针对内部原理做出说明。一般情况下我们不需要知道虚拟机的运行原理,只要专注写java代码就可以了,这也正是虚拟机之所以存在的原因--屏蔽底层操作系统平台的不同并且减少基于原生语言开发的复杂性,使java这门语言能够跨各种平台(只要虚拟机厂商在特定平台上实现了虚拟机),并且简单易用。这些都是虚拟机的外部特性,但是从这些信息来解释虚拟机,未免太笼统了,无法让我们知道内部原理。
从进程的角度解释JVM
让我们尝试从操作系统的层面来理解虚拟机。我们知道,虚拟机是运行在操作系统之中的,那么什么东西才能在操作系统中运行呢?当然是进程,因为进程是操作系统中的执行单位。可以这样理解,当它在运行的时候,它就是一个操作系统中的进程实例,当它没有在运行时(作为可执行文件存放于文件系统中),可以把它叫做程序。
对命令行比较熟悉的同学,都知道其实一个命令对应一个可执行的二进制文件,当敲下这个命令并且回车后,就会创建一个进程,加载对应的可执行文件到进程的地址空间中,并且执行其中的指令。下面对比C语言和Java语言的HelloWorld程序来说明问题。
首先编写C语言版的HelloWorld程序。
[cpp] view plain copy#include
#include
int main(void) {
printf("hello world
");
return 0;
}
编译C语言版的HelloWorld程序:
[plain] view plain copygcc HelloWorld.c -o HelloWorld
运行c语言版的HelloWorld程序:
[plain] view plain copyzhangjg@linux:/deve/workspace/HelloWorld/src$ ./HelloWorld
hello world
gcc编译器编译后的文件直接就是可操作系统识别的二进制可执行文件,当我们在命令行中敲下 ./HelloWorld这条命令的时候, 直接创建一个进程, 并且将可执行文件加载到进程的地址空间中, 执行文件中的指令。
作为对比, 我们看一下Java版HelloWord程序的编译和执行形式。
首先编写源文件HelloWord.java :
[java] view plain copypublic class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
编译Java版的HelloWorld程序:
[java] view plain copyzhangjg@linux:/deve/workspace/HelloJava/src$ javac HelloWorld.java
zhangjg@linux:/deve/workspace/HelloJava/src$ ls
HelloWorld.class HelloWorld.java
运行Java版的HelloWorld程序:
[plain] view plain copyzhangjg@linux:/deve/workspace/HelloJava/src$ java -classpath . HelloWorld
HelloWorld
从上面的过程可以看到, 我们在运行Java版的HelloWorld程序的时候, 敲入的命令并不是 ./HelloWorld.class 。 因为class文件并不是可以直接操作系统识别的二进制可执行文件 。 我们敲入的是java这个命令。 这个命令说明, 我们首先启动的是一个叫做java的程序, 这个java程序在运行起来之后就是一个JVM进程实例。
上面的命令执行流程是这样的:
java命令首先启动虚拟机进程,虚拟机进程成功启动后,读取参数“HelloWorld”,把他作为初始类加载到内存,对这个类进行初始化和动态链接(关于类的初始化和动态链接会在后面的博客中介绍),然后从这个类的main方法开始执行。也就是说我们的.class文件不是直接被系统加载后直接在cpu上执行的,而是被一个叫做虚拟机的进程托管的。首先必须虚拟机进程启动就绪,然后由虚拟机中的.类加载器加载必要的class文件,包括jdk中的基础类(如String和Object等),然后由虚拟机进程解释class字节码指令,把这些字节码指令翻译成本机cpu能够识别的指令,才能在cpu上运行。
从这个层面上来看,在执行一个所谓的java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程,而不是我们写的一个个的class文件。这个叫做虚拟机的进程处理一些底层的操作,比如内存的分配和释放等等。我们编写的class文件只是虚拟机进程执行时需要的“原料”。这些“原料”在运行时被加载到虚拟机中,被虚拟机解释执行,以控制虚拟机实现我们java代码中所定义的一些相对高层的操作,比如创建一个文件等,可以将class文件中的信息看做对虚拟机的控制信息,也就是一种虚拟指令。
编程语言也有自己的原理, 学习一门语言, 主要是把它的原理搞明白。 看似一个简单的HelloWorld程序, 也有很多深入的内容值得剖析。
- 上一篇:java技术三大特性是什么
- 下一篇:java语法基本编程
- 标签列表
-
- 作文
- 其他类
- 体裁作文
- 节日作文
- 高中作文
- 小学生作文
- 语文
- 美文
- 教育
- 句子
- 阅读
- 古诗文
- 文学赏析
- 大全
- 问答
- 读后感
- 写作指导
- 外语
- 外语课堂
- 名著阅读
- 字数作文
- 祝福语
- 词汇
- 爱好
- 唐代诗人
- 作文素材
- 学历类
- 瑞文网
- 交际礼仪文书
- 歌词
- 高考
- 散文
- 励志
- 观后感
- 古籍
- 计算机类
- 职场
- 造句
- 教案
- 外语类
- 资格证类
- 古诗
- 语录名言
- 阅读答案
- 人物作文
- 书画
- 学科教育
- 句子大全
- 日常行政公文
- 总结
- 课文大全
- 规章制度
- 知识
- 宋代诗人
- 板报大全
- 成语大全
- 近义词
- 诗词
- 工作总结
- 初一作文
- 手抄报
- 诗
- 试题
- 优美句子
- 节日庆典
- 职业技能
- 诗句
- 好词好句
- 诗歌
- 春节
- 现代作家
- 关于什么的作文
- 事务文书
- 名言语录
- 求学指南
- 高校排名
- 素材
- 自然作文
- 教学设计
- 书信函范文
- 词语
- 学生范文
- 大学
- 对联
- 读后感大全
- 演讲稿
- 琴棋
- 初二作文
- 初三作文
- 文艺体育
- 乐谱
- 赏析
- 学习资料
- 语录