`

虚拟机基本构造

    博客分类:
  • jvm
阅读更多

JVM主要包括两个子系统和两个组件。两个子系统分别是Class loader子系统和Execution engine(执行引擎) 子系统;两个组件分别是Runtime data area (运行时数据区域)组件和Native interface(本地接口)组件。

Class loader子系统的作用:根据给定的全限定名类名(如cc.ejb.example.HelloWorld)来装载class文件的内容到 Runtime data area中的method area(方法区域)。

Execution engine子系统的作用:执行classes中的指令。任何JVM specification实现(JDK)的核心都是Execution engine,不同的厂商有自己不同的实现。

Native interface组件:与native libraries交互,是其它编程语言交互的接口。当调用native方法的时候,就进入了一个全新的并且不再受虚拟机限制的世界,所以也很容易出现JVM无法控制的native heap OutOfMemory。

最后是Runtime Data Area组件:这就是我们常说的JVM的内存了。它主要分为五个部分——

  1. Heap (堆):一个Java虚拟实例中只存在一个堆空间
  2. Method Area(方法区域):被装载的class的信息存储在Method area的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。
  3. Java Stack(java的栈):虚拟机只会直接对Java stack执行两种操作:以帧为单位的压栈或出栈。
  4. Program Counter(程序计数器):每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
  5. Native method stack(本地方法栈):保存native方法进入区域的地址

以上五部分只有Heap 和Method Area是被所有线程的共享使用的;而Java stack, Program counter 和Native method stack是以线程为粒度的,每个线程独自拥有自己的部分。

方法区

在JVM实例中,加载的类型的相关信息被保存在内存的一个逻辑区域中,称为方法区 method area。当JVM加载一个类型时,它用类装载器查找需要的Class文件。类装载器读入Class文件并以二进制数据的线性流传递给VM。 虚拟机从二进制数据中提取有关类型的信息,并将之保存在方法区中。而保存类里定义的类变量(静态变量)的内存被从方法区中拿走。下面的信息存储在方法区中:

  • 类型信息
    The fully qualified name of the type
    The fully qualified name of the type’s direct superclass (unless the type is an interface or class java.lang.Object, neither of which have a superclass)
    Whether or not the type is a class or an interface
    The type’s modifiers ( some subset of` public, abstract, final)
    An ordered list of the fully qualified names of any direct superinterfaces

The Constant Pool
For each type it loads, a Java virtual machine must store a constant pool. A constant pool is an ordered set of constants used by the type, including literals (string, integer, and floating point constants) and symbolic references to types, fields, and methods.

Field Information
For each field declared in the type, the following information must be stored in the method area:

The field’s name
The field’s type
The field’s modifiers (some subset of public, private, protected, static, final, volatile, transient)

Method Information
For each method declared in the type, the following information must be stored in the method area:

The method’s name
The method’s return type (or void)
The number and types (in order) of the method’s parameters
The method’s modifiers (some subset of public, private, protected, static, final, synchronized, native, abstract)
An exception table

Class Variables
Class variables are shared among all instances of a class and can be accessed even in the absence of any instance. These variables are associated with the class–not with instances of the class–so they are logically part of the class data in the method area. Before a Java virtual machine uses a class, it must allocate memory from the method area for each non-final class variable declared in the class.

Constants (class variables declared final) are not treated in the same way as non-final class variables. Every type that uses a final class variable gets a copy of the constant value in its own constant pool. As part of the constant pool, final class variables are stored in the method area–just like non-final class variables. But whereas non-final class variables are stored as part of the data for the type that declares them, final class variables are stored as part of the data for any type that uses them.

A Reference to Class ClassLoader
For each type it loads, a Java virtual machine must keep track of whether or not the type was loaded via the bootstrap class loader or a user-defined class loader. For those types loaded via a user-defined class loader, the virtual machine must store a reference to the user-defined class loader that loaded the type. This information is stored as part of the type’s data in the method area.

A Reference to Class Class
An instance of class java.lang.Class is created by the Java virtual machine for every type it loads. The virtual machine must in some way associate a reference to the Class instance for a type with the type’s data in the method area.

Method Tables
For each non-abstract class a Java virtual machine loads, it could generate a method table and include it as part of the class information it stores in the method area. A method table is an array of direct references to all the instance methods that may be invoked on a class instance, including instance methods inherited from superclasses. A method table allows a virtual machine to quickly locate an instance method invoked on an object.

No related content found.

  • 大小: 61.5 KB
分享到:
评论

相关推荐

    Java虚拟机的基本结构:图片解说1

    Java虚拟机的基本结构:图片解说1

    Java虚拟机讲解,欢迎下载

    #### Java虚拟机基本结构 1. **类加载子系统**:负责从文件系统或网络加载Class文件,并将其存储在方法区。方法区还可以存储运行时常量池信息。 2. **Java堆**:几乎所有Java对象实例都存储在这里,堆空间对所有...

    深入解析ANDROID虚拟机

    分别讲解了Android系统的基础知识、Android系统的结构和核心框架、Java虚拟机和Dalvik虚拟机的知识、实现程序编译和调试、Dalvik的运作流程、DEX优化和安全管理、Android虚拟机生命周期管理和内存分配策略、虚拟机...

    《深入Java虚拟机》整理

    - **Java虚拟机基本结构**: - **启动类装载器**:这是JVM的一部分,通常用C/C++编写,负责加载Java API的核心类库。 - **用户定义的类装载器**:由Java语言编写,允许开发者自定义类的加载方式,以满足特定需求或...

    Java虚拟机的基本结构 (2)1

    局部变量表主要用于存储基本数据类型、对象引用和returnAddress类型。 3. **本地方法栈(Native Method Stack)**:与虚拟机栈类似,但主要服务于Java虚拟机调用的本地(Native)方法,即非Java语言编写的方法。 4...

    Android Dalvik虚拟机结构及机制剖析第2卷

    首先,我们要理解Dalvik虚拟机的基本概念。Dalvik并非传统的Java虚拟机(JVM),而是针对移动设备进行了优化,采用.dex格式的字节码,这种格式更小、更适合内存有限的移动设备。Android应用的源代码编译成Dalvik字节...

    Java虚拟机规范中文版(JavaSE7).pdf

    Java虚拟机指令集是虚拟机执行的基本操作单元,每条指令对应一个特定的操作,如加载和存储变量、算术运算、控制流程、对象创建和方法调用等。这些指令是无操作数的,它们的参数通常在操作数栈上找到。Java SE 7版的...

    虚拟机VM源代码

    在"虚拟机easyVM代码"这个子文件夹中,你可能会发现以下结构: - CPU相关的源文件,可能包括处理器模拟的实现,如`cpu.c`或`interpreter.c`。 - BIOS的源代码,可能命名为`bios.c`或`bootloader.c`,用于启动虚拟机...

    简易虚拟机

    虚拟机的基本原理是通过软件模拟硬件功能,创建一个独立的、完全自包含的计算环境,这个环境被称为虚拟机实例。在简易虚拟机中,这一过程被优化以达到最小化内存占用和快速启动的效果。尽管体积小巧,只有1MB多,但...

    易语言源码控制qemu虚拟机.rar

    1. **易语言**:了解易语言的基本语法、数据类型、控制结构和函数调用方式是理解和修改源码的基础。 2. **QEMU虚拟化技术**:理解QEMU如何模拟硬件环境,以及如何通过API或命令行与虚拟机进行交互。 3. **虚拟机管理...

    JAVA 11 虚拟机规范

    Java虚拟机规范是一套详细描述Java虚拟机(JVM)结构和行为的文档,其目的是让Java语言能够在不同的平台上运行,同时保持“一次编写,到处运行”的承诺。在Java 11版本中,虚拟机规范进行了更新,提供了对Java 11...

    深入java虚拟机笔记

    - **Java体系结构概述**:本章主要介绍了Java体系结构的基本概念及其组成部分。Java体系结构旨在为开发者提供一个统一、高效且跨平台的应用开发环境。 - **Java虚拟机(JVM)**:JVM是Java体系的核心组件,负责解释...

    易语言控制qemu虚拟机

    4. **虚拟机管理**:理解虚拟机的基本概念,如虚拟化技术、虚拟机配置文件(如XML文件)、虚拟硬件设置(CPU、内存、磁盘、网络设备等)是非常重要的。这将帮助你更好地控制QEMU虚拟机的启动参数和状态。 5. **文件...

    配置虚拟机的jar

    Spring Data Redis提供了丰富的API,使得开发者能够方便地使用Redis的数据结构,如字符串、哈希、列表、集合、有序集合等。它还支持事务、发布/订阅、地理位置操作等。在Spring框架内,你可以通过配置Bean来轻松集成...

    Java虚拟机规范(中文版).pdf

    它定义了JVM的概念模型,即一个抽象的计算机,规定了其运行时环境的基本结构和行为,包括类格式、数据类型、指令集、异常处理、垃圾回收等方面的标准。这一规范的重要性在于,它确保了跨平台的Java代码能够一致地...

    易语言汇编检测虚拟机源码

    1. **易语言基础**:包括基本语法、变量声明、控制结构(如循环、条件语句)、函数调用等。 2. **易语言与汇编交互**:介绍如何在易语言中嵌入和调用汇编代码,以及如何处理汇编指令的输入和输出。 3. **虚拟机...

    虚拟机设计实现-HEC-配书原代码

    1. **虚拟机基本概念**: - 虚拟机(Virtual Machine, VM)是一种模拟计算机硬件的软件系统,它可以运行在其上特定的指令集,提供一个与实际物理机器隔离的执行环境。 - 虚拟机的主要任务是将高级语言编译成虚拟机...

Global site tag (gtag.js) - Google Analytics