JVM各个内存分别存储的什么东西

1 方法区(1.8之后改为metaspace：元空间)：存放类和常量，静态变量
2 程序计数器(线程私有): 用于记录线程执行代码的位置。
3 Java虚拟机栈(线程私有)：用于存储局部变量的。

线程执行方法时：会有一个对应的栈帧结构，栈帧记录的是该线程进入的各个方法中使用的变量。比如main方法调用了method1方法，method1调用了method2，method2调用了method3
其中三个方法内分别定义了a1,a2,a3变量。 那么main线程对应的栈结构就是  

另一方面，在method3， method2，method1 依次执行完后 各个栈帧出栈，栈帧中的变量也就消失了，但是变量指向的对象还存在于堆中，这个对象是需要垃圾收集器去回收的。

4 java堆内存：这个基本上就是存储对应的地方

全部串起来就是这个图

5 还有一个就是本地方法栈了，就是java类库中 native方法对应的栈

java最后一个能操作的内存区域就是堆外内存，NIO就与这个相关，一些场景下 堆外空间可以提升性能