深入浅出JVM:运行时数据区域

Posted psxjoy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出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 错误。

    ####运行时常量池
    • 方法区的一部分;
    • 存放编译期产生的各种字面量和符号引用;
    • OOM 报错和方法区一致。

以上是关于深入浅出JVM:运行时数据区域的主要内容,如果未能解决你的问题,请参考以下文章

深入理解java:1.3.1 JVM内存区域的划分(运行时数据区)

深入理解JVM:JVM执行时数据区域分类

jvm,深入理解java虚拟机,运行时数据区域

jvm,深入理解java虚拟机,运行时数据区域

jvm,深入理解java虚拟机,运行时数据区域

《JVM系列》 第三章 -- 深入理解JVM运行时数据区