Java程序运行期数据区
Java虚拟机的内部由类装载器、运行时数据区和执行引擎组成,如图2.7所示。类装载器用来装载我们要执行的Java类,执行引擎负责执行被装载类的方法中的指令。而Java程序运行时,需要在内存中存储许多东西,包括字节码、程序中创建的对象、变量等等。Java虚拟机把这些东西都组织到“运行时数据区”中,以便于管理。
一个正在运行的Java程序在内存中以进程的形式存在,Java虚拟机为该进程分配内存空间。而一个进程可以有一到多个线程,多个线程共享该进程的内存空间。每个线程是一个单独的执行单元。Java程序运行时,某些数据区是由程序中所有线程共享的,还有一些则只能由一个线程所拥有。
每个Java虚拟机都有一个方法区和一个Java堆(Heap),它们是由该Java虚拟机中所有线程共享的。类文件的字节码以及常量池(常量和字面量)放在方法区,而程序运行时所创建的所有对象都放在堆中。
当一个新线程被创建时,该线程就会被分配一个属于它自己的Java栈和PC寄存器。如果线程正在执行的是一个Java方法,那么PC寄存器的值总是指示下一条将被执行的指令。而它的Java栈则总是存储该线程中Java方法调用的状态,包括方法中的局部变量、被调用时传递进来的参数、返回值以及运算中间结果等。
对于基本类型的变量,Java虚拟机将其放在Java栈中。
对于引用类型的变量,引用变量本身放在Java栈中,而引用所指向的对象放在Java堆中。