黑马程序员技术交流社区

标题: Java知多少虚拟机(JVM)以及跨平台原理 [打印本页]

作者: 洋葱头头    时间: 2015-9-9 12:52
标题: Java知多少虚拟机(JVM)以及跨平台原理
相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的。
那么,跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM)。

JVM也是一个软件,不同的平台有不同的版本。我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件。Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。

而这个过程中,我们编写的Java程序没有做任何改变,仅仅是通过JVM这一”中间层“,就能在不同平台上运行,真正实现了”一次编译,到处运行“的目的。

JVM是一个”桥梁“,是一个”中间件“,是实现跨平台的关键,Java代码首先被编译成字节码文件,再由JVM将字节码文件翻译成机器语言,从而达到运行Java程序的目的。

注意:编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样。

所以,运行Java程序必须有JVM的支持,因为编译的结果不是机器码,必须要经过JVM的再次翻译才能执行。即使你将Java程序打包成可执行文件(例如 .exe),仍然需要JVM的支持。

注意:跨平台的是Java程序,不是JVM。JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM。

作者: lizhichao    时间: 2015-9-10 07:50
理解透彻。学习了
作者: 0825王欢    时间: 2015-9-10 08:52
顶一下.............///
作者: 放飞邹莺    时间: 2015-9-10 09:05
温故而知新哈哈
作者: michael_wlq    时间: 2015-9-10 10:35
复习一下!
作者: 笑笑精灵    时间: 2015-9-10 10:57
赞一下~~~
作者: 雷勇兵    时间: 2015-9-10 11:08
复习一下
作者: Messing    时间: 2015-9-10 13:18

作者: pz_xiaoxie    时间: 2015-9-10 14:22
学习下,
作者: 碎影斑斓    时间: 2015-9-10 14:29
额,再复习一下
作者: WOJIAOLIZHEN01    时间: 2015-9-10 14:37
理解的非常透彻,长见识了
作者: Java_EE    时间: 2015-9-10 14:44
原来编译生成的字节码文件不是机器文件,不能够被直接运行。我明白了,为什么我的基础测试题做错了呀!!
作者: 迷茫不堪的年纪    时间: 2015-9-10 17:37
大哥您这个也太透彻了吧,  是 JRE>JDK>JVM   的节奏么? 同时还有每个系统的JVM版本不一样,需要进行相关下载!  大哥,我理解得对不对啊?
作者: zhangcheng0403    时间: 2015-9-10 18:13
嗯,很全面啊
作者: doterlm    时间: 2015-9-10 18:49
于是就水了一贴
作者: 641113495    时间: 2015-9-10 19:25
很详细啊,顶一下,虚拟机就是胖翻译
作者: Ethan丶    时间: 2015-9-13 08:35
支持支持,学习了,顶一下
作者: liuyang10908126    时间: 2015-10-24 17:31
很好的总结!
作者: 土豆丝    时间: 2015-10-24 17:58
大神呀.....
作者: 洋葱头头    时间: 2015-10-26 11:38
迷茫不堪的年纪 发表于 2015-9-10 17:37
大哥您这个也太透彻了吧,  是 JRE>JDK>JVM   的节奏么? 同时还有每个系统的JVM版本不一样,需要进行相关 ...

JDK包含JRE啊
你下载JDK时  不是有选择系统版本的吗
作者: Synaric    时间: 2015-10-26 16:48
哈哈,今天面试第一道就是这个
作者: 迷茫不堪的年纪    时间: 2015-10-26 22:33
洋葱头头 发表于 2015-10-26 11:38
JDK包含JRE啊
你下载JDK时  不是有选择系统版本的吗

是 JDK>JRE>JVM 吧?最近让一些人混洗了。
作者: 活到老,学到老    时间: 2015-11-15 16:25

真的是666,不过我还是在北京学。只要努力在哪里都能出头~~
作者: 赵存金    时间: 2015-11-15 16:28
不错。。。
作者: r1503882525    时间: 2016-2-8 00:28
用编写软件编写的代码交给javac命令编译成class文件——cass文件通过JVM虚拟机翻译成计算机可识别的机器代码运行。
作者: r1503882525    时间: 2016-2-8 00:30
迷茫不堪的年纪 发表于 2015-9-10 17:37
大哥您这个也太透彻了吧,  是 JRE>JDK>JVM   的节奏么? 同时还有每个系统的JVM版本不一样,需要进行相关 ...

JRE-JDK是两个不同的打包软件。跟java代码的运行原理没关系。
原始代码——编译器生成class——JVM翻译成机器码——运行。
作者: shiax11    时间: 2016-2-8 12:14
赞一下  说明很彻底
作者: shiax11    时间: 2016-2-8 12:17
感觉说实话jre就是一个程序 这个程序运行文件就是.class
作者: 宋达思    时间: 2016-2-8 14:05
不错,这块儿还真不是太清楚呢~~
作者: 洋葱头头    时间: 2016-2-15 10:44
活到老,学到老 发表于 2015-11-15 16:25
真的是666,不过我还是在北京学。只要努力在哪里都能出头~~

说得好
作者: 雪域雄鹰    时间: 2016-2-18 11:11
恩,很好,学无止境,要每天学习,不学习就是在退步。
作者: zhangchao5292    时间: 2016-3-28 00:12
总结的不错啊
作者: duanbozhi    时间: 2016-4-17 21:53
长知识了。。。。。
作者: 永和豆浆    时间: 2016-4-20 00:49
都是大神啊......
作者: huhemingtiancai    时间: 2016-4-20 01:14
洋葱头头 发表于 2015-9-9 12:52
相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何 ...

是这呀,顶
作者: pengmin    时间: 2016-5-10 12:54
谢谢版主大人的分享 再次加深了印象




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2