深刻浅出JVM(一):运行时数据区域

JVM运行时数据区

程序计数器

  • 线程私有
  • 指向了正在执行的虚拟机字节码指令的地址;若是是本地方法,数值为空
  • 没有 OutOfMemoryError 错误的区域

Java虚拟机栈

  • 线程私有;
  • 生命周期与线程相同;
  • 表明着 Java 方法执行的内存模型:每一个方法执行时的同时会建立一个栈帧(Stack Frame)用于存放局部比量表、操做数栈、动态连接、方法出口等信息。
    • 每一个方法从调用到执行完毕的过程,对应着每个栈帧在虚拟机栈中入栈到出栈的过程。
  • 若是线程请求的栈深度大于虚拟机容许的深度,跑出 StackOverflowError 异常;没法申请到足够的内存,抛出 OutOfMemoryError 错误。

本地方法栈

  • 线程私有;
  • 和 Java 虚拟机栈相似,可是是为 Native 方法服务。

Java 堆

  • 线程共享;
  • Java 虚拟机中内存最大的一块;
  • 唯一的做用是存放对象实例:全部的对象实例以及数组都要在堆上分配
  • 是垃圾收集器的主要区域。详细区分的话,能够分为新生代和老年代,再细致的话,能够分为 Eden 空间、 From Surivor 空间、 To Surivor 空间;
  • Java 堆能够处于物理上不连续的内存空间中,只要逻辑是连续的便可。 主流的虚拟机经过 -Xms-Xmx控制;
  • 若是堆中没有内存完成实例分配,而且堆没法再拓展时,抛出 OutOfMemoryError 错误。

方法区

  • 线程共享;
  • 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;
  • 已被称为 Non-Heap;
  • 有时候被称为永久带,缘由:HotSpot 虚拟机将GC分带收集拓展至方法区;
  • 方法区内存没法知足内存分配需求时,抛出 OutOfMemoryError 错误。java

    ####运行时常量池
    • 方法区的一部分;
    • 存放编译期产生的各类字面量和符号引用;
    • OOM 报错和方法区一致。
相关文章
相关标签/搜索