Java的平台无关性(JVM简介)

提示:本文中部分内容图片节选自互联网,无意冒犯。如有侵权请私信联系作者即可删除、更改。

JVM是Java Virtual Machine(Java虚拟机)的缩写,它并非是一个真实的机器,而是一个虚构出来的计算机程序用于统一不同操作系统平台的运行规范,是通过调用实际计算机的各种指令功能来完成任务的虚拟计算机程序。
在这里插入图片描述
从图中可以看到,JVM为操作系统提供字节码文件的指令输出。JVM只需要保证能够正确执行.class文件,并对不同的操作系统平台输出对应的系统指令就可以运行在如Linux、Windows、MacOS等操作系统平台上了。
所以Java能够做到跨平台这一点JVM功不可没。如我们在Maven仓库下载的jar包、我们自己编写的程序,不需要在每个平台上再编译一次,直接使用同一个编译文件就能直接运行在不同类型的服务器种。包括现在的一些JVM的扩展语言,比如Clojure、JRuby、Groovy等,编译到最后都是.class文件。那么我们的应用程序、JVM和操作系统之间的关系是怎样的呢?如下图:

在这里插入图片描述
如上图所示:JVM是Java程序能够运行的核心,它负责向操作系统申请运行时变量和对象的内存空间,并统一管理它们。但需要注意的是,JVM执行字节码文件(.class文件)时。需要提前加载Java的基本类类库,即JRE中的一些工具包。比如操作文件、连接网络等。这些类图文件会JVN运行阶段提前加载进JVM。
JVM标准加上Jaava提供的基础类库,就组成了Java的运行时环境(Java Runtime Environment JRE)。 前面曾提到过JRE是Java运行程序所需的环境,而JDK是供开发者使用的开发工具包(SDK),除了JRE之外还包括一些开发所需的工具,如Java编译器(javac)和打包工具、以及运行Jar包的解压器等。
上面曾提到了Java虚拟机规范。那么Java虚拟机规范和Java语言规范有何关系呢?请看下图:
在这里插入图片描述
上图中的左半部分是一个版本的Java虚拟机和Java虚拟机规范,它规定了Java的运行环境,为不同操作系统运行是输出相同的功能的指令,右半部分是Java的语法规范它规定了Java编程时开发者所要遵循的语法。如:int代表整形、for代表循环等。Java文件经过编译成为字节码,在经过JVM转化为不同平台的计算机操作指令集,完成对应的功能调用。如果.class文件的规格是不变,这两部分是可以独立进行优化的。
Java虚拟机采用基于栈的架构,其指令由操作码和操作数组成。

操作码被称为Opcode,为一个字节(8 bit)的长度,所以指令集的操作码总数不可能超过 256 条,它代表着这条指令的操作类型,即某种特定的操作。
操作数(Operands):是这条指令实际操作数据零个或者多个,紧跟在操作码之后。

JVM就是靠解析这些指令集来完成程序的执行。当我们使用Java命令运行.class文件时,就会启动一个JVM进程。然后JVM会翻译这些字节码,完成程序的输出。

JVM执行字节码有两种执行方式。常见的就是解释执行,将opcode+操作数翻译成机器代码;另外一种执行方式就是JIT,也就是我们常说的即时编译,它会在一定条件下将字节码编译成机器码之后再执行。

另外JVM除了上边介绍的屏蔽操作系统的差异以外。还有一个功能就是前面提到过Java的简单性之一就是提供了自动内存管理的特性。这种特性直接在操作系统上实现是根本不可能做到,所以就需要JVM进行一番转换。当然除此之外JVM还有其他一些功能,本章就不过多介绍,有兴趣的小伙伴可以自行阅读有关JVM的书籍查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值