前提
JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型。
那JVM运行时数据区又是什么?
它包括:程序计数器、虚拟机栈、本地方法栈、方法区、堆。
来看看它们都是干嘛的
程序计数器:保存当前线程执行的指令的地址(大意如此)。
虚拟机栈:由栈帧组成,而每个栈帧又包括局部变量表、操作数栈、动态连接(调用其他方法)、出口(被调用时返回值) -- 每个栈帧就代表了一个方法的执行。
本地方法栈:类似虚拟机栈,只不过方法改成了native方法。
方法区:保存了类的各种信息、类的常量、类的静态变量 -- 请注意,不包括类的普通变量!
堆:各种对象所在。
前三者都是线程内的资源,所以不会存在同步问题!
其实按照咕泡学院海天老师的说法是,程序计数器、虚拟机栈、本地方法栈 这三个对应了冯诺依曼结构中的运算器、控制器;而方法区、堆则对应了冯诺依曼结构中的IO和存储器。耳目一新!
再来看看JVM堆内存模型
我们常说的新生代、老年代、永久代(JDK1.8之后变成了MetaSpace),就是JVM堆内存模型!
最后,很多书上(包括教科书)都把堆(heap)叫做堆栈,而把栈(stack)叫做栈,个人觉得这是一种很扯淡的叫法。
待续。