Java虚拟机是进行Java程序执行的唯一通道,现在的Java程序本质上属于虚拟机语言,所有的语法都按照虚拟机的语法进行编写,在执行的时候由虚拟机负责与操作系统底层进行交互。
Java程序执行流程
- Java语言本身属于编译型和解释型的编程语言,所以所有的“*.java”源文件代码都必须通过Java虚拟机编译工具编译为“*.class”文件,随后在Java虚拟机上进行解释执行。
- Java虚拟机如果要想进行“*.class”Java程序类的加载,那么就必须依靠ClassLoader来完成。在Classloader中默认的加载路径为程序类所在目录,在使用CLassLoader类进行类加载的时候所采用的全部都是字节数据的形式,利用字节输入流的方式实现的字节码文件的加载。
- 当程序代码加载到JVM之中后会通过运行时的数据区为该程序文件里面的变量进行相应的内存空间的开辟,随后在JVM里面会依据此运行时数据区进行所需要的数据内容的加载,在程序运行的时候除了程序的执行引擎要负责程序代码的执行之外,还有可能牵扯到一些本地方法的调用,所有的本地方法在Java里面全部都使用native关键字来进行定义,而实现是通过操作系统本身的底层函数来完成的,这一过程是由JVM负责协调调度。【Java虚拟机里面,是一个将JVM的代码与本地代码混合的步骤,由于不同操作系统针对于同一功能有不同的实现,所以考虑到所有系统的适应性,那么会在不同的平台上提供有各自不同的JVM】。
Java对象访问模式
在Java里面最为重要的就是对象,对象所对应的空间都在堆内存中进行数据的存储,整个Java对所有对象引用记录的信息是通过专门的变量表维护的。
除了对象变量表之外,另一层含义就是关于对象的引用模式。所有的对象都有地址和对应的数据,那么如何可以将地址和数据对应起来,就通过引用模式来完成。对象引用模式在实际中有两类模式:
- 通过句柄访问。(C++)
- 通过直接指针访问(Java现在用的这一种)
如上图中所有的引用通过本地变量表直接引用到了对象实例空间之中,而后在此实例空间之中会利用数据指针找到对象所对应堆内存空间的数据内容。所以在Java语言之中是没有“句柄”这一概念的。但是这一操作是HotSpot虚拟机标准来决定的。
由图上关系可看到,现在主流的JDK都是基于HotSpot的,实际上Sun推出的Java虚拟机就是由HotSpot改进来的。我们安装Java环境时使用的Java -version命令中就可以看到此信息。