Java知多少(2)虚拟机(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。html



图1  JVM实现跨平台

关于JVM的执行效率

Java 推出的前几年,人们有不一样的见解,解释字节码确定比全速运行机器码慢不少,牺牲性能换来跨平台的优点是否值得?

然而,JVM 有一个选项,能够将使用最频繁的字节码翻译成机器码并保存,这一过程被称为即时编译。这种方式确实颇有效,导致微软的 .NET 平台也使用了虚拟机。

如今的及时编译器已经至关出色,甚至成了传统编译器的竞争对手,某些状况下甚至超过了传统编译器,缘由是JVM能够监控运行时信息。例如,即时编译器能够监控使用频率高的代码并进行优化,能够消除函数调用(即“内嵌”)。

可是,Java 毕竟有一些C/C++没有的额外的开销,关键应用程序速度较慢。好比Java采用了与平台无关的绘图方式,GUI程序(客户端程序)执行要慢;虚拟机启动也须要时间。函数

客户端市场的折戟

Java 的GUI库称不上出色,界面不算友好,大部分用户不太习惯;Java 的客户端资源消耗也比较大,大数据量的应用和功能复杂的应用性能堪忧。

更加不能接受的是,微软因自身利益和SUN分家后,Windows 便再也不预装JVM了,用户安装你的程序以前,必需要安装JVM并正确设置,你能够要求普通用户安装你的软件,可是你能指望他了解JVM的有关知识并正确安装设置吗?

虽然你能够将JVM集成在你的程序中,自动安装并设置,不让用户干预,可是你但愿附带一个比你的程序还要大好多的JVM吗?一个软件这样作或许能够接受,成千上万个软件都这样作,那用户要安装多少个JVM?磁盘空间要浪费多少?

因此,直接投放市场的面向普通用户的客户端程序,用Java开发的不多,大部分Java开发的客户端是给企业内部员工使用,员工领到电脑时,技术部已经给配置好了。若是你但愿从事客户端开发,建议学习 C/C++ 和 .NET,它们在Window客户端开发方面有较大的优点。

种种缘由,注定了Java客户端不利于推向市场,让普通用户接受。不过话又说回来,客户端开发也不是Java的初衷,Java最初是面向嵌入式的,却随着互联网的兴起而快速成长,在Web开发上大显身手。性能

系列文章:学习

Java知多少(上)
大数据

Java知多少(中)优化

Java知多少(下)spa

相关文章
相关标签/搜索