网站首页 > 精选教程 正文
什么是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中。(理论上如此,虽然现在还没有什么实现方式)
猜你喜欢
- 2024-11-23 如何将本地文件提交到GitHub仓库?
- 2024-11-23 再见FTP/SFTP!是时候拥抱下一代文件传输利器Croc了
- 2024-11-23 「Java」使用WatchService监听文件变化
- 2024-11-23 springboot上传文件出错IOException: The temporary upload location
- 2024-11-23 Java,通过文件获取MimeType的方式,文件扩展名获取ContentType
- 2024-11-23 将20M文件从30秒压缩到1秒,我是如何做到的?
- 2024-11-23 拥抱文件传输利器 Croc
- 2024-11-23 完整教程:使用Spring Boot实现大文件断点续传及文件校验
- 2024-11-23 java中oss分片上传(包含业务和详细讲解)
- 2024-11-23 JAVA全栈CMS系统vue图片/视频上传组件,多图上传及删除功能11
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)