1、堆
1.1、存储Java对象(例如数组)。
1.2、在不考虑本地内存的情况下,JVM堆是JVM中占用内存最大的区域。
1.3、线程共享。
1.4、Java堆是垃圾回收器管理的内存区域。
2、方法区
2.1、是JVM规范中的抽象概念,具体实现例如HotSpot的永久代与元空间。永久代在方法区中,需要通过-XX:PermSize和-XX:MaxPermSize设置内存大小,内存不足时会导致OOM;元空间使用本地内存,默认无内存上限,支持通过-XX:MetaspaceSize和-XX:MaxMetaspaceSize设置内存大小。
2.2、存储类信息、常量、静态变量、即时编译后的字面量与符号引用等数据。
2.3、线程共享。
3、Java虚拟机栈
3.1、存储基本数据类型(byte、short、int、long、float、double、boolean、char)与对象的引用。
3.2、线程独占。
3.3、是Java方法执行的区域,每个方法被调用时都会创建一个栈帧并入栈,当方法正常返回或者向上抛出异常时,栈帧就会出栈。
3.4、栈帧的组成
3.4.1、局部变量表
包含方法执行过程中的变量,编译时确定。
3.4.2、操作数栈
操作变量并执行方法的模型。
3.4.3、返回地址
将当前程序执行的下一条指令地址入栈,用于方法返回时继续执行。
3.4.4、动态链接
将当前方法在运行时常量池的符号引用转化为直接引用的过程。
4、本地方法栈
4.1、调用native修饰的本地方法的区域。
4.2、线程独占。
5、程序计数器
5.1、指向当前线程正在执行的字节码指令,描述当前线程执行的进度。
5.2、线程独占。
5.3、用于保证程序在线程切换时仍能按顺序执行。
6、执行引擎
执行Java字节码指令的模块。
7、本地引擎
执行本地方法的模块。
8、本地方法库
执行本地操作系统相关指令的模块。