JVM内存模型分为:堆和方法区(JVM1.8中,方法区为元数据区)是所有线程共有的,而虚拟机栈,本地方法栈和程序计数器则是线程私有的。
![](https://img-blog.csdnimg.cn/11da4e6213a946d6852941898b466d03.png)
堆:java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中,后续再讲)
![](https://img-blog.csdnimg.cn/5bbad4627d034a79937f504c63bfd285.png)
方法区:存放从class文件里加载进来的类的,而且常量池也是在这块区域内的。
虚拟机栈:主管Java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。每个线程在创建时都会创建一个虚拟机栈,
其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用。
本地方法栈:与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务。
程序计数器:字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。