jvm 1的整体结构。类加载子系统:类加载子系统负责从文件系统或互联网加载类信息,加载的类信息存储在一个叫做方法区的内存空间中。 除了类信息之外,运行时常量池信息也可以存储在方法区域中,包括字符串和数字常量(该常量信息是类文件中常量池的内存映射)。2.堆:java堆是虚拟机启动时建立的,是java程序的主要内存工作区。 几乎所有的java对象实例都存储在java堆中。 堆空间是所有线程共享的,是与java应用密切相关的内存空间。 3.java栈:每个java虚拟机线程都有一个私有的java栈。线程的java堆栈是在创建线程时创建的。java栈保存了框架信息、局部变量和方法参数,这些都与java方法的调用和返回密切相关。4.本地方法栈:本地方法栈和java栈很像,但最大的区别是java栈是用来调用方法的。本地方法堆栈用于调用本地方法。作为java虚拟机的重要扩展,java虚拟机允许java直接调用本地方法(通常用C编写)。5.方法区:线程共享,类的所有字段和方法字节码,还有一些特殊的方法比如构造函数。这里还定义了接口代码。 简单来说,所有定义的方法的信息都存储在这个区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存储在方法区域。虽然Java虚拟机规范将方法区描述为堆的逻辑部分,但是它有一个别名叫做非堆(Non-Heap),应该与Java堆相区别。6.程序计数器:也叫PC寄存器,它是每个 在任何时刻,一个java线程总是在执行一个方法,正在执行的方法被称为当前方法。 如果当前方法不是本地方法,PC寄存器将指向当前正在执行的指令。 如果当前方法是局部方法,则PC寄存器的值未定义7。执行引擎:执行引擎是java虚拟机的核心组件之一,负责执行虚拟机的字节码。现代虚拟机为了提高执行效率,会把方法编译成机器码,然后执行。
![](http://bm.damiseo.cn/15914/www.php-asp.net/dami/0831197001606269558tp1-1.jpg)