总体来说,方法区和堆是所有线程共享的内存区域;而虚拟机栈、本地方法栈和程序计数器的运行是线程私有的内存区域,运行时数据区域就是我们常说的JVM的内存。
- 类加载子系统:根据给定的全限定名类名(如:java.lang.Object)来装载class文件到运行时数据区中的方法区中,类加载器主要分为三种:启动类加载器、扩展类加载器和应用程序类加载器。
- Java堆:堆就是给对象分配内存,用来存放对象实例
- 方法区:它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据(注意这里没有局部变量,局部变量是存在栈中的)
- 程序计数器:用于记录当前线程所执行的字节码指令地址
- 虚拟机栈【Java方法】:每个java方法被执行的时候都会同时在虚拟机栈中创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、返回方法地址等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程,Java虚拟机栈也是线程私有的,它的生命周期与线程相同。
- 本地方法栈:与虚拟机栈类似,用于支持Java调用本地方法(Native Method)。本地方法是用C、C++等编写的方法,可以直接调用操作系统的底层接口和硬件资源,实现Java程序无法完成的功能。
- 执行引擎(解释器):负责将编译后的字节码指令翻译成机器码并执行。执行引擎主要分为两种:解释器和即时编译器。
- 本地库接口:本地库接口(Native Interface,JNI)是Java提供的一种机制,用于在Java程序中调用本地方法(Native Method)。本地方法是用C、C++等编写的方法,可以直接调用操作系统的底层接口和硬件资源,实现Java程序无法完成的功能。