Java虚拟机(一)--java程序是如何被运行的
本文参考了inside the java virtual machine, second edition。下面的链接中有这本书部分章节的内容,可以参考一下:http://www.artima.com/insidejvm/ed2/index.htmlJava程序编译运行的过程。Java程序的运行是由class文件,java API和java虚拟机共同完成的。可以认为java虚
本文参考了inside the java virtual machine, second edition。
下面的链接中有这本书部分章节的内容,可以参考一下:
http://www.artima.com/insidejvm/ed2/index.html
- Java程序编译运行的过程。
Java程序的运行是由class文件,java API和java虚拟机共同完成的。可以认为java虚拟机是一个java程序在其中运行的抽象计算机。
java的体系结构包含下列技术:
- java编程语言--即是我们熟知和经常使用的java语言
- java class文件--就是将源.java文件编译成的.class文件。实际上,在java虚拟机规范中,有对class文件结构和内容的定义。只有编译出来的class文件符合这个规范,才能保证这个class文件在所有的java虚拟机上都能运行。
- java API--当java代码中需要做比如io操作时,实际调用的就是实现了java API的类。大家知道,io操作实际是依赖于底层操作系统的,例如在操作系统A中,实际删除文件调用的是本地方法(native method) remove(),而操作系统B中实际调用的是delete()。而程序员不关心,也不知道自己到底应该调用remove还是delete,而是去调用java API中规定的统一方法deleteFile()。当程序在A中运行时,java虚拟机中的执行器会将deleteFile()解释为本地方法remove()。这就是为什么java被称为解释性语言(interpreted)的原因--编译后的class文件不是二进制可执行文件,而是字节码。字节码不能独立运行,必须靠java虚拟机解释成本地代码后才能执行。
- java虚拟机
而java虚拟机和java API共同构成了java程序的运行平台。
执行过程:
1,java编译器会将.java源文件编译成.class文件,class文件中存放的是字节码(bytecode)。
2,class文件被放置在运行环境,该环境应已安装了与硬件相对应的java虚拟机。例如在一个新型微波炉上运行java程序,则应把class文件copy到微波炉的存储器中,并安装好微波炉版的java虚拟机。
3,java虚拟机用class loader装载class文件。java虚拟机有多个class loader,具体在后面的内容中介绍。
4,java虚拟机中的执行引擎解释并执行被装载的class。
执行引擎有多种,互相的区别在于效率不同:
1,一次性解释字节码 -- 字节码一次性被解释为本地机器码后运行。
2,just-in-time complier -- 第一次被执行的字节码被翻译成本地机器码后放入缓存,之后可重复使用。这意味着,一些在运行时没有被调用的代码会一直是字节码。
3,自适应优化 -- 只有被频繁使用的字节码才会被翻译成本地机器码后放入缓存。其他字节码在需要使用时即时翻译。
4,最后一种硬件芯片执行引擎 -- 这种执行引擎实际是内嵌在芯片里的。
hotspot是现在java流行的一种执行引擎技术,大家可以查看这里:
http://en.wikipedia.org/wiki/HotSpot
Java程序通过调用本地方法(native method)与主机交互。 Java有两种方法:java方法和本地方法。
java方法是用java语言编写,编译成字节码存放在class文件中的。
native方法是用c,c++或汇编语言编写的,与处理器相关的机器码。本地方法保存在动态链接库中,是各个平台专有的。通过使用本地方法,java程序可以直接访问底层操作系统的资源。运行中的java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库。
现在举一个有意思的例子:
一种新生产的微波炉实现了上网功能,现在想开发一种浏览器。那么微波炉的制造商会开发一套微波炉的操作系统,该操作系统提供底层操作需要的本地方法接口。
如getFilesInMicrowaveoven()
这样,java程序员完全可以写一个平台相关的java程序来调用getFilesInMicrowaveoven(),以实现底层操作。但这样的java程序不能被移植到其他操作系统上使用。
或者所有微波炉制造商达成一致,所有新型微波炉都实现了本地方法接口Java Native Interface(JNI),
这样,java程序员可以通过使用该接口,让程序在所有微波炉平台上运行。但仍然是平台相关的。
最后,如果这真是一个很牛x的微波炉制造商,他可以提供针对该微波炉操作系统的java虚拟机。
这样java程序员就可以自由的开发java程序,同时该程序可以任意迁移到别的平台上。
此外,如果在微波炉上的某个方法不在java API之列,例如“烤鱼”。那么程序员就不得不写一个java程序,用它来直接调用本地方法而无法使用java API。
更多推荐
所有评论(0)