在eclipse、netbeans、IntelliJ等IDE继承开发环境下,很多程序猿认为java语言不需要经过编译等过程,直接点击运行按钮就ok,其实这是错误的。IDE帮我们提高开发效率的同时,其实也屏蔽了很多java程序执行的细节,使得我们很多时候并不了解JVM内部的运行机制。这里结合我结合网上查找的一些资料和自己的实践体会,总结一下java语言的运行机制。
Java程序的运行必须经过编写、编译、运行三个步骤。
Java语言这种“一次编写,到处运行(write once,run anywhere)”的方式,有效地解决了目前大多数高级程序设计语言需要针对不同系统来编译产生不同机器代码的问题,即硬件环境和操作平台的异构问题,大大降低了程序开发、维护和管理的开销。但是我们需要注意的是,Java程序通过JVM(Java虚拟机)才可以达到跨平台特性,但JVM是不跨平台的。也就是说,不同操作系统之上的JVM是不同的,Windows平台之上的JVM不能用在Linux上面,反之亦然。
我们可以通过helloworld来理解这几个缩写词的具体含义:
1
2
3
4
5
|
public
class
HelloWorld {
public
static
void
main(String[] args) {
System.out.println(
"helloworld"
);
}
}
|
编译之后, 我们得到了HelloWorld.class
在HelloWorld里面, 我们调用了 JAVA API中的 java.lang.System这个类的静态成员对象 out, out 的静态方法:
然后我们让虚拟机器来执行这个HelloWorld。
有了这个流程后,我们就好理解几个术语了:
JDK: java develop kit (JAVA API包)
SDK: software develop kit,以前JDK 叫做java software develop kit,后来出了1.2版本后,就改名叫jdk了,省时省力,节约成本。
JRE. java runtime environment我们的helloworld必须在JRE(JAVA运行环境,JAVA运行环境又叫JAVA平台)里面,才能跑起来。
JVM java virtual machine. 简单地讲, 就是把class文件变成字节码, 然后送到excution engine中执行。而为什么叫虚拟机,而不叫真实机呢?因为JVM本身是又不能运算,又不能让显示器显示"helloworld"的,它只能再调用host system的API,比如在w32里面就会调c++的API,来让CPU帮他做做算术运算,来调用c++里面的API来控制显示器显示显示字符串。而这些API不是JDK里面有的,我们平时又看不见的,所以我们就叫它native api了。
——————————————————————————
解决一个颇有渊源的问题: JVM、JDK、JRE, what the fuck?
JDK是整个Java的核心,包括了Java运行环境(jre)、一堆java工具和java的基础类库
JRE是java运行时环境。既然是运行时环境,不难理解意思就是没了这东西你java程序跑不起来呗。也就是说这个是java的运行平台,所有的程序都要在JRE下才能跑起来。它包括了JVM和java的核心类库,与jdk相比它不包含开发工具(编译器、调试器和其他工具)。jre文件夹下有两个子文件夹bin和lib,可以认为bin是JVM而lib则是JVM工作所需要的类库。所以,在你写完java程序编译成.class文件之后,你可以把这个.class文件和jre一起打包发给你的朋友,这样他就可以运行你写得程序了。
JVM就是java虚拟机,是JRE的一部分。是虚构出来的一个计算机。jvm有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有指令系统。它的主要工作就是解释自己的指令集并映射到本地的CPU指令集或者OS的系统调用。Java语言的跨平台特性就是不同的操作系统中,JVM的映射规则不同。另外,JVM对上层的java源文件不关心,只关心由源文件生成的类文件(*.class)。
╮(╯▽╰)╭ ok,总结一下,jdk是帮助你开发和编译用的。jre中的jvm运行你的程序,但是只有jvm还不行,还需要jre中的核心类库。
ok,很多书上讲”这个问题应该是每一个初学者总会遇到的问题“,但是其实本文在开始的时候就没遇到过。因为如果你上课没听讲,压根儿不知道什么环境变量这回事儿,也没做任何**的配置,那么你依然可以自如的编写自己的hello world,甚至编一个邮件接收客户端都是没问题的。
——WHY?
——因为有IDE。当你启动eclipse的时候IDE会自动加载系统中已经安装好的jdk,并且把第一次加载时jdk的环境设为IDE的默认环境。也就是说,你可以不配置环境变量,但是至少搞个jdk装上吧……
不配也行哎,完事大吉?
No,如果你想进阶,开发个web程序或者搞搞其他的东西,你就会发现,没有环境变量是不行的。例如,如果你运行tomcat,如果不配好环境变量的话,tomcat就跑不起来啦。
我们上网查阅资料后,总结一下,需要配置的环境变量有三个(其实也可以是两个啦,如果写绝对路径的话):