Java运行时数据区-JVM内存模型详解
Run-time data areas
- java运行期数据区包括一下区域(如下图,注:本人oneNote所作笔记,为保证格式文章内大部分文字以图片形式展示)



- 栈帧
- 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(返回值地址)
- 方法开始执行后,只有两种方式可以退出:方法返回指令,异常退出
- 帧数据区
- 具体流程如下图所示



- invoke指令(如下图)

- 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 零拷贝