JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

什么是JVM和字节码.class文件?它们的关联又是什么?

wys521 2024-11-23 23:52:05 精选教程 21 ℃ 0 评论

什么是JVM和字节码.class文件?它们的关联又是什么?

1. 什么是JVM

JVM(Java Virtual Machine)即是Java虚拟机的缩写,所以不要再画蛇添足的叫JVM虚拟机了。

它是运行Java字节码(即.class文件)的虚拟机,由于java是跨平台的,所以jvm虚拟机针对不同系统(windows,linux,macOS)也有不同的实现。

个人理解:

jvm相当于代码的一个翻译,到windows里就翻译成window能听懂的语言,到linux里就翻译成linux能听懂的语言。因此同样的代码在不同的平台,结果的执行操作也几乎是相同的,只是中间翻译的这一步不同。

这应该就是java跨平台性的原理,它不需要开发者会“多国语言”,只要会java语言就够了。它也不需要每个国家(系统)都支持它的语言,只需要为每个国家搭配一名专业的翻译(JVM),将java语言翻译成这个国家能听懂的语言就够了。

2.什么是字节码(.class)

在java中,JVM可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向Java虚拟机(JVM)。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序的运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java程序无需重新编译便可在多种不同操作系统的计算机上运行。

个人理解:

字节码文件(.class)是通过Java文件(.java)编译后得到的,它只会被Jvm处理,也是JVM唯一能理解的语言。并且这个编译过程是无视平台的,也就是不管你在什么环境下进行编译,由java文件生成的.class文件都是一样的。和平台有关的步骤是Jvm解析字节码文件的时候,它需要将字节码文件解析成操作系统能执行的机器语言指令,然后执行指令。这一步由于不同的操作系统有不同的命令,所以会产生差异。

整体流程:

.java文件(源代码)===编译===》.class文件(字节码文件)===JVM解析===》二进制机器码

3.为什么需要字节码(.class)

通过前面我们都明白了JVM才是跨平台的核心,那为什么在此之前还要再加工一次,让.java类加工成.class呢?为啥不直接让jvm理解.java文件,直接进行翻译运行呢?这样我们就无需多关心一层.class文件了,直接将.java交给JVM,它内部该编译就编译,该执行就执行,对我们来说也不用关心那么多了。

首先我必须说明,在我看来**.class文件和java跨平台性没有多少直接联系**,跨平台性核心是靠JVM去实现的,不同平台编译出的字节码文件是完全一样的。

说个题外话:

网上很多人看到这种问题一股脑就把跨平台性掏出来说,显得很“理所当然”,这是在我看来这多少显得有点不懂装懂。百度出来的大部分回答就是这样,但是至少也比那些看起来很牛掰却只会让你去百度,其实自己屁都答不出来的fw强多了。

当然,现在我也只能以猜测性质简单的回答一下,因为我对这块内容的学习也不够深入,所以以后有机会更深入时再回来补充。

字节码文件(.class)带来的好处

①提高效率

对java文件进行语法检查、语义分析这一步会消耗大量的时间资源,编译成字节码文件相当于提前处理了源文件,提前做好了大量的工作。这样将字节码文件交给JVM运行的时候,就可以为JVM节省很多负担了。这样就可以做到让java程序能够运行高效,如果这些操作都直接不经处理的交给jvm去做,肯定就无法满足高效这一词,有些大项目光编译就要好几分钟。如果去掉提前编译,直接让JVM解析java文件,那么当你启动这个项目的时候一定会觉得慢的离谱。

②资源节约

字节码文件可以看做是对源文件的提炼压缩封装,它占用更少的空间更快的传输速度。

③提升兼容性

只要满足jvm的规范,即便你是其他语言的代码,只要能编译成class文件,同样可以运行在jvm中。(理论上如此,虽然现在还没有什么实现方式)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表