JVM运行时数据区和各个区域的作用

2018-12-29  本文已影响0人  单v纯微笑

一、JVM主要分为5个核心区域(6个子区域),分别是:

  1. 程序计数器
  2. Java虚拟机栈
  3. 本地方法栈
  4. Java堆
  5. 方法区
  6. *运行时常量池(属于“方法区”的一部分)

二、各个区域作用和描述

序号 区域名称 共享 作用 异常 备注
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高级特性与最佳实践》一书

上一篇 下一篇

猜你喜欢

热点阅读