JAVA虚拟机概述

1. 几个问题

       1.1.Java Virtual Machine(简称JVM)是什么?

        JVM是一种用于计算设备的规范,用于在实际的计算机上模拟实体计算机功能的虚拟计算机规范。JVM提供的基于抽象规格描述的计算机模型,为解释程序开发人员提供了很好的灵活性(,同时也确保Java代码可在符合该规范的任何系统上运行。JVM定义了控制Java代码解释执行和具体实现的五种规格,它们是:
JVM指令系统,JVM寄存器(PC寄存器等),JVM栈结构,JVM碎片回收堆,JVM存储区。

        1.2. JVM有哪些版本?

         JVM的实现有多种,比如sun公司(现在属于oracle)的HotSpot版本,BEA公司的(也被oracle收购了)JRockit版本。在jdk8中,JRockit版本已经被合并吸收了,还叫hotspot。J9 VM,J9是IBM开发的一个高度模块化的JVM,在许多平台上,IBM J9 VM都只能跟IBM产品一起使用。Zing VM,Zing VM是一个从Sun HoSpot VM fork出来的一个高性能JVM,可以运行在Linux/x86-64平台上,主要重写了GC部分。IKVM.NET,直接能在.net上运行完整的java程序。Android上的Dalvik / ART虽然名字不叫JVM,但骨子里也是不折不扣的JVM。

        1.3. JVM是用什么语言实现的?

        是用C++/C语言写的,大部分是C++,少部分是C语言,比如JNI(Java本地接口,用于和其他语言通信)。一个主要原因是,C++的类可以很容易的实现java的类,且JVM要同底层硬件,操作系统打交道,C++的指针操作很受用。
实际上,任何语言都能够实现JVM,只要符合JVM的规范即可。Java语言本身也可以实现JVM,只是需要在JVM上面跑,这似乎是个哲学问题。。。

        1.4. JDK,JRE,JVM,编译器,这几者之间是什么联系?


从小的开始:JVM已经讲了,就是运行在实体计算机平台上,模拟计算机功能的虚拟机,讲的具体点就是bin目录下的jvm.dll文件;里面最重要的是执行引擎。Jre= jvm + lib:java runtime environment,Java的运行环境,有了jre才能运行java程序,最重要的是rt.jar,JAVA基础类库。Jdk=jre+工具(javac,java,javadoc等)+java基础类库(主要如tools.jar,dt.jar等)。举个例子:使用javac编译器编译时出现下面的错误提示:


解析:输入的javac的命令不是去JDK中bin目录去找的javac.exe,而是去JDK中lib目录中的tools.jar中com.sun.tools.javac.Main中执行,javac.exe只是一个包装器(Wrapper),存在的目的只是为了让开发者免于输入过长的指命。儿操作系统装入JVM,则是通过jdk/bin中的Java.exe来完成。

总结:JDK包含JRE,而JRE包含JVM,总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能,Eclipse、IntelliJ IDEA等其他IDE有自己的编译器而不是用JDK bin目录中自带的javac。

2. JVM的体系结构



再给出JVM自身的体系结构


从上图可以看到:JVM结构主要包括两个子系统和两个组件。两个子系统分别是Classloader子系统和Execution engine(执行引擎)子系统;两个组件分别是Runtime data area(运行时数据区域)组件和Native interface(本地接口)组件。

3. 类加载机制,ClassLoader子系统


猜你喜欢

转载自blog.csdn.net/qq_40632862/article/details/80910168