1. 程序计数器:
是一块较小的内存空间. 记录当前线程执行到字节码的行号, 程序的流程控制, if , while ... 异常处理, 线程恢复等功能都是依赖计数器实现的
2. 虚拟机栈
和程序计数器一样, 虚拟机栈是线程私有的. 生命周期和线程相同.
每个方法被执行的时候,Java虚拟机都 会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信 息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程
通常我们说JVM 内存的时候, 会笼统的说 堆区, 栈区. 而 栈区一般指的就是虚拟机栈中的局部变量表部分.局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、 float、long、double)、对象引用
3. 本地方法栈
与虚拟机栈相似, 只是调用的是本地方法服务, 线程私有
4. Java 堆
Java 虚拟机规范说, 所有对象, 数组. 都应该在堆上分配. 不过随着 java语言的发展, 这个说法渐渐的不绝对了.
java 堆是垃圾回收期管理的内存区域.
5. 方法区
线程共享的, 各个线程运行共享的内存区域域,它用于存储已被虚拟机加载 的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
永久代 是 hotspot 实现方法区的一个捷径.这样它可以向管理堆区一样管理这部分内存, 原则上如何实现方法区是虚拟机实现细节.
永久代 是 方法区实现, 方法区不一定是永久代 jdk6: 方法区改用本地内存 native memory 实现 jdk8: 方法区完全抛弃了永久代的概念, 使用元空间 meta-space来代替
6. 运行时常量池
方法区的一部分
Class文件中除了有类的版本、字 段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生 成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
7. 直接内存
直接内存, 不属于虚拟机运行时的一部分, 也不是虚拟机规范定义的内存区域.
比如NIO, 通过native函数, 调用本地库. 分配堆外内存