Java运行时数据区-JVM内存模型详解

173 阅读2分钟

Run-time data areas

  • java运行期数据区包括一下区域(如下图,注:本人oneNote所作笔记,为保证格式文章内大部分文字以图片形式展示) image.png

image.png

image.png

  • 栈帧
    • Local veriable table(局部变量表)
      • 在编译程序代码的时候就可以确定需要多大的局部变量表,具体大小可以在编译后的class文件中看到
      • hotspot的local veriable table非常类似于寄存器,临时存放一些数据,然后运算完成之后再将数据存回去
      • 局部变量表以 veriable slot(变量槽)为最小单位,每个变量槽都可存在32个字节长度的内存空间
      • 其余参数则按照参数表顺序排列,占用从1开始的局部变量槽
      • 基本数据类型以及引用和return address占用一个变量槽,long和double需要两个
    • Operand Stack(操作数栈)
      • 每个局部变量都有自己的操作数栈。
      • 同样可以在编译器确定其大小
      • Frame被创建时,操作栈是空的。操作栈的每个项可以存放JVM各种类型的数据,其中long和double(64位数据)占用两个栈深
      • 方法执行中,会有各个字节码指令往操作栈中写入和提取内容,也即是入栈和出栈的过程
      • 操作栈调用其他有返回值得方法时,会把返回结果push到栈上(通过操作栈来进行参数传递)
    • Dynamic Linking(动态连接)
      • 每个栈帧都包含一个指向运行时常量池的该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接
      • 在类加载阶段中的解析阶段会将符号引用转化为直接引用,这种转化也称为静态解析。另外的一部分将在运行时转化为直接引用,这部分称为动态链接
    • Return Address(返回值地址)
      • 方法开始执行后,只有两种方式可以退出:方法返回指令,异常退出
    • 帧数据区
      • 帧数据区的大小依赖于JVM的具体实现
  • 具体流程如下图所示

image.png

image.png

image.png

  • invoke指令(如下图) image.png
  • Mtehod area :小于1.8的时候FGC不会清理,大于1.8的时候回自动清理,只有在小于1.8的时候才会产生OOM
    • Perm Space(<1.8)
      • 字符串常量位于Perm Space
      • FGC不会清理
      • 大小启动时指定,不能修改
    • Meta Space(>=1.8)
      • 字符串常量位于堆
      • 会触发FGC垃圾清理
      • 不设定的话最大就是物理内存
  • Runtime Constant Pool:运行时常量池
  • Direct Memory 直接内存(1.4之后添加)
    • JVM可以直接访问的内核空间的内存(OS管理的内存)
    • NIO ,提高效率 实现zero copy 零拷贝