Java内存区域

运行时数据区域

线程私有

  1. 程序计数器
    Program Counter Register, 是一块较小的内存, 可以看作是当前线程所执行的字节码的行号指示器. 概念上, 可以与CPU内的PC相对应.
    如过线程正在执行的是一个Java方法, PC记录的是字节码的地址; 如果正在执行的是Native方法, PC为空(Undefined).
    ** 没有定义 OutOfMemoryError **
  2. 虚拟机栈
    Java方法执行的内存模型, 存储局部变量表, 操作数栈, 动态链接, 返回地址等信息.
    ** 两种异常情况: **
  • 如果请求栈深度超标, 抛出 StackOverflowError
  • 如果VM允许动态扩展栈, 但还是不够, 抛出 OutOfMemoryError
  1. 本地方法栈
    与虚拟机栈类似, 只不过是面向Native方法服务.
    注 : 在HotSpot VM 中, 虚拟机栈和本地方发展合二为一.
    ** 两种异常情况 : **
  • StackOverflowError
  • OutOfMemoryError

线程共享


  1. 几乎所有的对象实例都在此创建, 有时也被称为GC堆
    ** 抛出 OutOfMemoryError **

  2. 方法区
    存储已被虚拟机加载的 类信息, 常量, 静态变量, 即时编译器编译后的代码等数据.
    曾被视为 堆 的一部分, 被称为 "永久代", 因为HotSpot的设计团队把GC分代收集扩展至方法区, 或者说使用永久代来实现方法区的垃圾回收, 管理内存. 在最新的HotSpot 中, 已将原来放在永久代的字符串常量池移除.
    ** 抛出 OutOfMemoryError **

  • 运行时常量池
    是方法区的一部分, 存放编译器生成的各种字面量和符号引用

直接内存

直接内存并不是虚拟机 运行时数据区 的一部分, 也不是Java虚拟机规范中定义的内存区域.
与之直接相关的是 NIO(New Input/OutPut) 类, 使用Native函数库直接分配堆外内存, 然后可以通过特殊的数据结构对这块内存进行操作, 避免了在Java堆和Native堆中来回复制数据.

** 大小不受Java堆大小的限制, 但是会受总内存等其它因素限制. 过大时, 可能限制了堆的动态扩展, 导致堆出现OutOfMemoryError.**

你可能感兴趣的:(Java内存区域)