JVM再了解了解

简介: 转自 http://www.cnblogs.com/Coda/p/4331432.html   相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的。

转自

http://www.cnblogs.com/Coda/p/4331432.html

 

相信大家已经了解到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。



图1  JVM实现跨平台

关于JVM的执行效率

Java 推出的前几年,人们有不同的看法,解释字节码肯定比全速运行机器码慢很多,牺牲性能换来跨平台的优势是否值得?

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

现在的及时编译器已经相当出色,甚至成了传统编译器的竞争对手,某些情况下甚至超过了传统编译器,原因是JVM可以监控运行时信息。例如,即时编译器可以监控使用频率高的代码并进行优化,可以消除函数调用(即“内嵌”)。

相关文章
|
1月前
|
存储 缓存 Java
JVM简单总结
Java运行时数据区包括:程序计数器、虚拟机栈、本地方法栈、堆空间和方法区(元空间)。这些区域各自承担不同的功能,如存储局部变量、方法调用信息、对象实例及运行时常量池等。其中,堆空间分为伊甸园、幸存者和老年代区域,方法区则包含类型信息、静态变量等。
|
5天前
|
存储 算法 Java
JVM简单理解
JVM简单理解
6 0
|
3月前
|
算法 Java Linux
深入理解JVM - Shenadoah
深入理解JVM - Shenadoah
57 1
|
10月前
|
存储 Java
JVM的组成
JVM的组成是为了提供一个独立于硬件和操作系统的执行环境,使得Java程序能够在不同的平台上运行。通过类加载器加载字节码,运行时数据区存储程序的运行时数据,执行引擎执行字节码指令,垃圾回收器管理内存,本地方法接口与本地库交互,从而实现Java程序的执行。这些组成部分相互配合,共同构成了JVM的功能和特性。
34 0
|
5月前
|
缓存 算法 Java
【每日一面】关于JVM
【每日一面】关于JVM
19 0
|
9月前
|
存储 缓存 算法
JVM初探
JVM初探
|
9月前
|
存储 Java
Jvm基本组成
了解jvm基本组成
65 0
|
11月前
|
Java 程序员 调度
浅谈 JVM
浅谈 JVM
52 0
|
存储 缓存 算法
JVM之JVM初探
JVM之JVM初探
106 0
JVM之JVM初探