一、JVM主要分为5个核心区域(6个子区域),分别是:
- 程序计数器
- Java虚拟机栈
- 本地方法栈
- Java堆
- 方法区
- *运行时常量池(属于“方法区”的一部分)
二、各个区域作用和描述
序号 | 区域名称 | 共享 | 作用 | 异常 | 备注 |
---|---|---|---|---|---|
1 | 程序计数器 | 线程私有 | 记录当前线程锁执行的字节码行号指示器。 | Java虚拟机规范中唯一一个没有规定OutOfMemoryError(内存不足错误)的区域。 | -- |
2 | Java虚拟机栈 | 线程私有 | 存放局部变量表、操作数据栈、动态链接、方法出口等信息。 | 栈深大于允许的最大深度,抛出StackOverflowError(栈溢出错误)。 内存不足时,抛出OutOfMemoryError(内存不足错误)。 |
常说的“栈”说的就是Java虚拟机栈,或者是Java虚拟机栈中的局部变量表。 |
3 | 本地方法栈 | 线程私有 | 和Java虚拟机栈类似,不过是为JVM用到的Native方法服务。 | 同上 | -- |
4 | Java堆 | 线程共享 | 存放实例化数据。 | 内存不足时,抛出OutOfMemoryError(内存不足错误)。 | 通过-Xmx和-Xms控制大小。 GC的主要管理对象。 |
5 | 方法区 | 线程共享 | 存放类信息(版本、字段、方法、接口等)、常量、静态变量、即时编译后的代码等数据。 | 内存不足时,抛出OutOfMemoryError(内存不足错误)。 | -- |
6 | 运行时常量池 | 线程共享 | 存放编译期生成的各种字面量和符号引用。 | 内存不足时,抛出OutOfMemoryError(内存不足错误)。 | 属于“方法区”的一部分。 |
7 | 直接内存 | -- | 如NIO可以使用Native函数库直接分配堆外内存,该内存受计算机内存限制。 | 内存不足时,抛出OutOfMemoryError(内存不足错误)。 | 不是JVM运行时数据区的一部分,也不是JVM虚拟机规范中定义的内存区域。但这部分内存也被频繁的使用。所以放到一起。 |
*参考《深入理解Java虚拟机 JVM高级特性与最佳实践》一书
网友评论