什么是JVM和字节码。class文件?它们的关联又是什么? 1。什么是JVM JVM(JavaVirtualMachine)即是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中。(理论上如此,虽然现在还没有什么实现方式)