一、Java虚拟机(JVM)是什么
JAVA可以完成“一次编译,到处运行”,就是写好源代码*.java,编译成.class(字节码)文件以后,可以在MAC、Windows、Linux上运行,而不用再去重新编译,这也是其跨平台的体现之处。一个JAVA源代码的运行过程粗略可以表示如下图:
源程序用文本编辑器就可以编写,这个无所谓,然后编译器会将其编译成字节码,即是class文件。对于用户而言,可以拿着这个class文件在其他平台上去运行,但是我们知道,不同的操作系统所能识别的可执行文件是不一样的,比如Windows可执行文件.exe,Linux下又是另外的类型的可执行文件(Linux下可执行文件是没有扩展名的,是依照文件本身的内容来定的,在shell中执行路径就行,不展开讲了),而同一个.class文件竟然可以不作任何更改就直接在不同操作平台上直接运行(当然前提是安装了JDK或者JRE),这是如何实现的呢?
我们知道,对于机器(CPU)来说,不论你采用什么语言,编写了什么东西,要想运行,最终都得翻译成010101,而操作系统是负责把操作系统所认识的可执行文件翻译成010101交给机器去运行。而Java虚拟机(JVM)完成的功能就是将.class文件翻译(解释)成操作系统能认识的格式。也就是说,在.class文件和操作系统之间,还有一层,这一层就是JVM,比如图中的类装载器、字节码检验器、解释器等等都是在JVM里面,JVM负责把.class文件解释成操作系统认识的文件,然后再执行程序。见下图:
也就是说可以理解为,编写好的.class文件是运行在虚拟机JVM上面的,而不同操作系统上的JVM是有所不同的,这个Sun公司已经做好了,对于编写 Java程序不用去管,只需要编写好程序,编译成.class文件就行了,不用考虑这个.class是要运行在什么操作平台上的,这也就是跨平台的地方,就是在操作系统和程序之间多隔了一层JVM,JVM屏蔽了底层运行平台的差别。所以可以说JAVA虚拟机就是去完成跨平台的。
而Java语言也是一种解释型语言,而不是编译语言,虽然在源代码到.class之间由编译,但是在JVM当中,程序运行的时候,是JVM一行一行的将.class解释成操作系统认识的文件再运行的。
二、Java垃圾收集机制
编程中操作内存是很关键的,在C/C++语言当中,划出的内存,使用结束以后都需要释放掉,说直白一点,内存就是一亩地,划出一小块地方来种玉米,玉米收割以后,得把地还回去,让别人来种地。但是在编C++的时候,还地的时候很关键,就是内存什么时候用完了,不再需要了,这个时机不好判断,不能还没用完就释放,当然也不能释放两次,这个对编程功底和指针的使用要比较熟练。
在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。什么时候去收这个垃圾,不需要程
序员来做,有了Java垃圾回收机制,不再需要的对象占用的内存空进会自动被回收。Java语言消除了程序员回收无用内
存空间的责任;它提供一种系统级线程跟踪存储空间的分配情况。在JVM空闲时,检查并释放那些可被释放的空间。
当然,C++的空闲内存回收时机是一空闲下来基本上马上就会被回收(依赖程序员水平),但是Java垃圾回收机制还没
有那么智能,它并不是在一个对象成为无用对象以后立马就去回收它所占用的空间,而是隔一定时间,统一检查空闲内
存,并且回收释放。
总之Java垃圾回收是减轻程序员负担,提升编程效率的一种方式。
三、个别概念区分
SDK和JDK的区别:SDK是Software Development Kit,软件开发工具包,是一个广义的概念,任何编程工具几乎都可以看成SDK。而JDK是Java Development Kit,是Sun公司针对Java编程的产品,范围仅限于Java。也就是说,JDK是SDK的一种。
开发需要JDK,用户运行只需要JRE,JDK包含了JRE,JRE当中又包含了JVM。见下图:
可以看到JDK当中很大一部分都包含的是运行环境JRE。