qbzf-Blog

title: JVM学习笔记——Java的内存区域
tags:

  • Java
  • JVM
  • 笔记
    categories: 学习笔记
    description: 最近开始着手JVM的学习,在这里把自己学习过程中的笔记分享出来,希望能帮到一些小伙伴,同时也是对自己的学习的一个梳理。
    date: 2018-08-30 21:16:24
    ---

Java的内存区域

内存区域划分图

内存区域划分图

内存区域的特征

  • 方法区(Method Area)

    • 线程共享区域
    • 存储被虚拟机加载的类信息、常量、静态变量、编译后的代码等。又被成为Non-Heap,为堆的一个逻辑部分。
    • 内存无法满足需求时,抛出OutOfMemoryError
    • 运行时常量池,具备动态性,运行期间也可以放入新的常量,例如String.intern()
  • 虚拟机栈(VM Stack)

    • 线程私有,生命周期与线程相同
    • 描述Java方法执行的内存模型。每次调用方法就创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息;结束方法时栈帧就出栈。
      • 局部变量表存放基本数据类型与对象引用类型(指向对象的指针)
    • 请求的栈深度超出虚拟机允许的深度,抛出*Error;如果设定了动态扩展深度,扩展时申请不到内存,抛出OutOfMemoryError
  • 本地方法栈(Native Method Stack)

    • 为native方法服务,在部分虚拟机中虚拟机栈和本地方法栈合二为一。
    • 其余特性与虚拟机栈类似。
  • 堆(heap)

    • 线程共享区域
    • 存放对象实例及数组,GC的主要区域;存储时处于物理上不连续的内存空间中;通过-Xmx和-Xms配置大小。
    • 堆无法扩展或没有内存完成实例分配时,抛出OutOfMemoryError
  • 程序计数器(Program Counter Register)

    • 线程私有
    • 当前线程所执行的字节码的行号指示器。执行普通方法时记录字节码指令地址;执行native方法时,则值为空(Undefined)

相关文章: