JVM内存区域
Java虚拟机在执行Java程序的过程中会把所管理的内存分为若干个不同的数据区域。这些数据区域都有各自的用途、以及创建和销毁时间。线程共享区域随着虚拟机进程的启动而存在,线程私有区域则依赖于线程的启动和结束而建立和销毁。

1、程序计数器(线程私有)
程序计数器用于保存当前线程所执行的字节码的行号。字节码解释器工作时就是通过改变这个计数器的值来选取下一条所要执行的字节码命令,分支、循环、跳转、异常处理、线程恢复(多线程轮流切换后恢复到本线程上一次的执行位置)等功能都依赖于程序计数器来完成。
2、虚拟机栈(线程私有)
虚拟机栈描述的是Java方法执行的内存模型(通过栈帧的形式存储每个实例方法):每个实例方法在执行同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。其中局部变量表存放了各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型。
3、本地方法栈(线程私有)
本地方法栈与虚拟机栈类似,区别是虚拟机栈为Java实例方法服务,而本地方法栈为Native方法服务。
4、堆(线程共享)
Java堆在JVM启动时创建,用于存放对象实例。
5、方法区(线程共享)
方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,该有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池存放。