下面是我阅读JVM规范的笔记。
1.单个线程的数据区(不共享)
每个单独的线程的数据区都包括程序计数器(Program Counter Register),虚拟机栈(Java Virtual Machine Stacks),本地方法栈(Native Method Stack)。当一个新线程被创建时,这些数据区会被一同创建。
程序计数器(Program Counter Register)被用来控制每个线程的执行,记录每个线程执行到哪了。
虚拟机栈(Java Virtual Machine Stacks)包含了栈帧,下面会给出视图。
本地方法栈(Native Method Stack)用来支持native方法,非java语言的方法。
2.所有线程共享的数据区
所有线程共享堆和方法区
堆(Heap)是我们最频繁处理的数据区。它储存了数组和对象。当虚拟机启动时就会创建这块数据区。垃圾回收GC主要在堆中工作。
方法区(Method Area):它存储的是已被虚拟机加载的类信息、常量(从JDK7开始已经移至堆内存中)、静态变量等数据。
运行时常量池(Runtime Constant Pool):每一个类或者接口,在其编译后生成的 .class文件中,有一个部分叫做 常量表(constant_pool_table),JVM将class文件加载以后,就解析常量表的内容到运行时常量池。
栈包含了若干个栈帧,当一个方法被调用时,一个栈帧就会被推入栈中。一个栈帧包含了局部变量数组(Local Variable Array),操作数栈( Operand Stack),常量池引用(Reference to Constant Pool)三部分。
有关更多信息,请到JVM规范官网。
推荐阅读 JVM入门——运行时数据区