JVM -- 01Java平台简述

前言:一次面试引发的“血案”

    前不久面试,面试官开门见山,来了一句:“说说你对Java平台的看法或者理解?”

    我:瞬间懵逼!。。。我能对Java他老人家有什么看法呢!

言归真正,这次面试给我很好的提了个醒。做开发两年确实菜鸟一枚,很多基础的东西自己一直抱着得过且过的心态,是应该静下心好好梳理夯实一下基础的东西了。那么就先从JVM开始弄起!~~~

1.浅谈Java平台

Java组成:

    

JDK组成:(支持Java程序开发的最小环境)


JRE组成:(支持Java程序运行的标准环境)


来~~,上个完整的大图


    我们日常会接触到JRE(Java Runtime Environment)或者JDK(Java Development Kit), JRE也就是Java运行的环境,包含了JVM和Java类库,以及一些模块等。而JDK可以看作是JRE的一个超集,提供了更多的工具,比如编译器,各种诊断工具等。

    Java本身是一种面向对象的语言,最显著的两个特性:Java号称“Write once, run anywhere”,能够非常容易地获得跨凭平台能力;还有就是垃圾收集(GC,Garbage Collection), Java通过垃圾收集器回收分配内存,大部分情况下,我们不需要自己操心内存的分配和回收。

二 Java是解释执行的?

    众所周知,我们通常把Java分为编译期和运行时,这里说的Java的编译和C/C++是有着不同的意义的,Javac编译,编译Java源码生成“.class”文件里面实际是字节码,而不是可以直接执行的机器码,Java通过字节码和Java虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节,这也是实现“Write once,Run anywhere”的基础。在运行时,JVM会通过类加载器(Class-Loader)加载字节码,解释或者编译执行。

    我们开发的Java源代码,首先通过Javac编译成字节码,然后,在运行时,通过Java虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just In Time)编译器,也就是通常所说的动态编译器。JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。所以Java是解释执行的?  不一定。

三 深入理解“一次编译,到处运行”

“一次编译、到处运行”说的是Java语言跨平台的特性,Java的跨平台特性与Java虚拟机的存在密不可分,可在不同的环境中运行。比如说Windows平台和Linux平台都有相应的JDK,安装好JDK后也就有了Java语言的运行环境。其实Java语言本身与其他的编程语言没有特别大的差异,并不是说Java语言可以跨平台,而是在不同的平台都有可以让Java语言运行的环境而已,所以才有了Java一次编译,到处运行这样的效果。
严格的讲,跨平台的语言不止Java一种,但Java是较为成熟的一种。“一次编译,到处运行”这种效果跟编译器有关。编程语言的处理需要编译器和解释器。Java虚拟机,相当于一个供程序运行的平台。
程序从源代码到运行的三个阶段:编码——编译——运行——调试。Java在编译阶段则体现了跨平台的特点。编译过程大概是这样的:首先是将Java源代码转化成.CLASS文件字节码,这是第一次编译。.class文件就是可以到处运行的文件。然后Java字节码会被转化为目标机器代码,这是是由JVM来执行的,即Java的第二次编译。

“到处运行”的关键和前提就是JVM。因为在第二次编译中JVM起着关键作用。在可以运行Java虚拟机的地方都内含着一个JVM操作系统。从而使JAVA提供了各种不同平台上的虚拟机制,因此实现了“到处运行”的效果。需要强调的一点是,java并不是编译机制,而是解释机制。Java字节码的设计充分考虑了JIT这一即时编译方式,可以将字节码直接转化成高性能的本地机器码,这同样是虚拟机的一个构成部分。

                                                                                                                                ———部分摘自 极客空间





猜你喜欢

转载自blog.csdn.net/PORSCHE_GT3RS/article/details/80808271