码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-11-12 21:53:42      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:stack   技术   frame   heap   uri   数组   jvm   from   线程   

技术图片

程序计数器

  • 线程私有
  • 指向了正在执行的虚拟机字节码指令的地址;如果是本地方法,数值为空
  • 没有 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(一):运行时数据区域

标签:stack   技术   frame   heap   uri   数组   jvm   from   线程   

原文地址:https://www.cnblogs.com/psxjoy/p/11845401.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!