JDK1.6,字符串常量池、运行时常量池,都存放在方法区(实现方式是永久带)。
JDK1.7,字符串常量池被单独从方法区(实现方式是永久带),移到堆中;运行时常量池还在方法区(实现方式是永久带)。
JDK1.8,字符串常量池还在堆中;运行时常量池还在方法区(实现方式是元空间)。
局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。
注:局部变量表以变量槽(slot)为最小单位,一个变量槽最大只允许保存四字节(即:32bit位)长度的变量。如果超过32bit位,则会开辟两个连续的slot。
| 数据类型 | 占用slot个数 | 占用字节(1字节=8bit位) | 说明 |
| byte | 一个slot | 1 | |
| short | 一个slot | 2 | |
| int | 一个slot | 4 | |
| long | 两个相邻的slot | 8 | |
| float | 一个slot | 4 | |
| double | 两个相邻的slot | 8 | |
| char | 一个slot | 2(c语言是1字节,可以存储一个汉字) | |
| boolean | 一个slot | 1/8 | |
| reference | 可能一个slot,可能两个slot | 对象实例的引用 注:虚拟机可以通过此引用直接或间接地查找到对象在堆中的数据存放的起始地址索引。 | |
| returnAddress | 一个slot | 为字节码指令jsr、jsr_w和ret服务的,指向了一条字节码指令的地址,实现跳转。 注:古老的Java虚拟机使用returnAddress来实现异常水处理,不过现在returnAddress已经被异常表取代了。 |
参考链接
JVM基础之栈、栈帧
线程栈-当前栈帧
Java内存分配详解(堆内存、栈内存、常量池)
JVM结构及堆的划分
聊聊java中进程线程有什么关系?



