JVM的内存,主要分为五个部分,分别为:
- 堆(Heap)
- 方法区(Method Area)
- JVM栈(JVM Stacks)
- 本地方法栈(Native Method Stacks)
- 程序计数器(The Program counter Register)
堆Heap
JVM堆是所有线程共享的。堆是用来运行时所有对象实例和数组划分内存的数据区域。堆也是我们的GC垃圾收集器主要管理的区域。
方法区Method Area
JVM方法区是所有线程共享的。方法区主要存储类的结构,如运行时常量池(run-time constant pool),属性(Field)和方法数据(method data),以及方法和构造方法的代码,包括实例和接口的初始化中用到的特殊方法。
JVM栈JVM Stacks
每个JVM线程都有一个私有的JVM栈,在线程创建的同时创建。JVM栈存储的数据叫做栈帧。
栈帧是用来存储数据和部分结果,及执行动态链接、方法返回值和分配异常。
栈帧是在每个方法被调用时创建的,方法执行完毕后销毁,无论正常执行完毕还是中断。每个栈帧都有自己的本地变量表、操作数栈和当前方法的运行时常量池。
本地方法栈Native Method Stacks
本地方法栈同JVM栈,不同点在于本地方法栈是针对于本地方法,JVM栈是针对JVM内的方法。
程序计数器The Program counter Register
JVM同一时间可以支持很多线程的执行。每个JVM线程都有自己的程序计数器。在同一时间,每个JVM线程都在执行单个方法的代码,即该线程的当前方法。如果该方法不是本地方法(native),程序计数器包含当前执行的JVM字节码指令地址。如果当前线程执行的方法是native的,程序计数器为undefined。程序计数器用来保存返回地址或本机指针。