JVM内存模型其实应该可以分为三大块,一块是加载类子系统,一块是字节码执行引擎,一块才是运行时数据区
加载类子系统负责将class文件加载进内存,放进方法区并暴露Class对象到堆中
字节码执行引擎负责对方法区中的代码进行执行
运行时数据区分为堆,方法区,栈,本地方法栈和程序计数器五大模块
堆和方法区是所有线程共享的,方法区主要就是存放代码结构,常量池及静态变量等,
堆主要存放对象实例,这些对象实例的地址分别由方法区里面的变量及栈里面的变量来指向
而栈,本地方法栈及程序计数器是线程私有的,每个执行的线程都在这些区域中拥有自己的一块小区域
本地方法栈主要存放执行方法的栈帧,每个方法对应一个栈帧,而栈帧主要包含局部变量表,
操作数栈,动态链接及方法出口
局部变量表顾名思义就是存放执行方法过程中局部变量的值
操作数栈主要用于当执行变量之间的操作的时候,首先会将局部变量表中的变量压入操作数栈中,再从操作数栈中弹出进行处理
动态链接主要是存放了常量池中需要运行时才确定的符号引用对应的直接引用
方法出口,就是保存当前执行到方法的哪一步,当执行完方法中的其他方法后,回到原本的方法还能找到对应的执行的位置继续往下执行
程序计数器主要就是存放执行的指令对应的行数,方便后续继续执行下一条指令
本地方法栈就是用于执行本地方法的时候提供所需要的的栈存储空间