Java虚拟机之体系结构

来源:互联网 发布:什么软件可以订民宿 编辑:程序博客网 时间:2024/04/29 20:29

       Java虚拟机是运行java程序的载体。每一个java程序,都会启动一个单独的Java虚拟机。虚拟机之间有自己独立的空间,相互之间不会干扰。那么,java程序的class文件是如何在虚拟机上运行的呢?我们先了解一下Java虚拟机的体系结构,以及其工作原理。

Java虚拟机的体系结构图

1.类装载器

       负责查找并装载类型。Java虚拟机提供两种类装载器:Java虚拟机中的启动类装载器;java程序中的自定义类装载器。自定义类装载器必须继承java.lang.ClassLoader,是普通的java对象。每个被装载的类,不管是被启动类装载器装载,还是被自定义类装载器装载,Java虚拟机都会创建一个java.lang.Class类的实例来表示该类。自定义类装载器和Class类的实例都存储在堆区,而类的信息存储在方法区。

     类装载器装载类的流程:

    装载:查找并装载类的class文件

    连接:验证类的正确性;为类变量分配内存,并初始化为默认值;符号引用转换为直接引用

    初始化:把类变量初始化为正确初始值。

2.方法区

       存储从class文件中装载的类的基本信息,是类在内存中的一种状态。如何将类从class文件中的状态映射到内存的方法区中状态,涉及到Java虚拟机中非常重要的一部分,那就是连接模型。这部分比较复杂,以后再单独介绍。

      方法区中类的信息主要包括:

      类的全限定名:类Object的全限定名为java.lang.Object

      类的直接父类的全限定名

     该类是类类型还是接口类型

     类的修饰符

     类直接实现的接口的全限定名列表

     类的常量池:所有常量有序集合,包括直接常量和符号引用,都是通过索引访问

     字段信息和方法信息

     类的静态变量:只与类有关,与实例无关,在方法区为其分配存储空间

 3. 堆

       存储运行时所创建的类的对象实例和数组。在java中,数组也是对象,也有对应的Class实例。不管数组的长度是多少,所有相同维度和类型的数组共用同一个Class实例。垃圾回收主要对该部件进行操作。

4. 栈

       每个线程都有自己独立的java栈,用栈帧的形式来保存线程的执行状态。线程每调用一个方法,就会在该线程的java栈中压入一个栈帧,存储该方法的参数、局部变量、中间运算结果等数据。

5.执行引擎

       Java虚拟机的实现核心,定义指令集。每个线程都是一个独立的执行引擎实例,它要么执行字节码指令,要么执行本地方法。

6.本地方法接口

       为Java程序调用本地方法提供的接口,为了可移植性和发挥主机平台的功能。Sun的本地方法接口是JNI(Java Native Interface)。

 

        以上部件在每个Java虚拟机中,只有一个,所有线程都会共享它们。因此,必须考虑多线程在同时访问它们的同步问题。




原创粉丝点击