java虚拟机运行时数据区(上)
java虚拟机运行时数据区(上)
注意:JDK1.7
概况
主要讲解虚拟机运行时数据区,看图说话。
1. 程序计数器(Program Counter Register)
- 程序计数器相对于一个团队的指挥,团队指挥人数肯定少,所以程序计数器占比内存也小,但是却很重要;
- 每个团队都有自己的指挥,不能说团队之间公用指挥,所以指挥对团队而言是私有的,所以程序计数器对
线程而言就是私有的。 - 那指挥能干什么呢,顾名思义,指挥大家进行详细且有条不紊的工作。 所以程序技术器就是指挥那条指令该执行,遇到分支走那一条,循环、什么时候跳转,异常怎么处理等等。都全权由程序计数器指挥。
- 每个团队的指挥也会遇到一些权力以外的事情,当然就不管了。所以,当程序计数器遇到 Native方法时,就以空表示,而遇到非本地方法,则记录正在执行的虚拟机字节码的地址。
- 团队没了指挥不管什么时候都是不行的,所以很定要有,所以程序计数器是java虚拟机中没有规定OutOfMemoryError情况的区域。
小节归纳:
- 程序计数器 占用
内存小
,线程私有
- 控制指挥字节码解析器有条理执行每条指令。
- 对Native方法,为空,非native,记录正在执行指令的地址。
- 唯一没有规定OutOfMemoryError 的区域。
2.Java虚拟机栈(Java Virtual Machine Stacks)
描述:
- Java虚拟机栈就像客栈,客栈是私有财产,来了就要付钱,所以属于线程私有
- 每个到这个客栈来的客人都会提供一位服务人员一对一服务,指引登记入住,管理你的私人物品,引导你下一步做什么,记录你的需求,直到送你离开。 而每个客人就像一个方法,而服务人员就像栈帧,每个方法都对应一个栈帧, 用于存储局部变量表,操作数栈,动态链接,如服务人员为客人服务,每个方法从开始到结束,就如同客人入住到离开,服务人都会始终为你服务,而栈帧也正如此。对应在虚拟机中入栈出栈过程。
小节归纳:
- 线程私有,同生共死
- 每个方法会有一个栈帧进行服务,从创建直到销毁的整个过程
- 栈帧作用:
- 存储局部变量表
- 操作数
- 动态链接
- 方法出口等。
两种异常:
- StackOverflowError : 栈的深度大于虚拟机允许深度
- OutOfMemoryError: 能够动态扩容,但是不能申请更多的空间
局部变量表
在编译完成以后就确定大小,不会在运行期间不会改变。
解释:
局部变量表存储各种数据类型(基本和对象引用)所占用的大小都是固定的。不会因为不同的解释器等有所不同。
所以编译完成以后,大小就确定了。
3.本地方法栈(Native Method Stack)
描述:
本地方法栈与java虚拟机栈基本一致。
区别:
1.顾名思义,为本地方法(native) 服务
2. 本地方法栈中的实现语言不同。具体实现由具体虚拟机定。
补充:HotSpot虚拟机直接合二为一。
小节
程序计数器、java虚拟机栈,本地方法栈都是线程私有。
参考资料
- 深入理解Java虚拟机
- 马士兵JVM性能调优 公开课