java虚拟机运行时数据区(上)

java虚拟机运行时数据区(上)

注意JDK1.7


概况

主要讲解虚拟机运行时数据区,看图说话。
java虚拟机运行时数据区(上)

1. 程序计数器(Program Counter Register)

  1. 程序计数器相对于一个团队的指挥,团队指挥人数肯定少,所以程序计数器占比内存也小,但是却很重要;
  2. 每个团队都有自己的指挥,不能说团队之间公用指挥,所以指挥对团队而言是私有的,所以程序计数器对
    线程而言就是私有的。
  3. 那指挥能干什么呢,顾名思义,指挥大家进行详细且有条不紊的工作。 所以程序技术器就是指挥那条指令该执行,遇到分支走那一条,循环、什么时候跳转,异常怎么处理等等。都全权由程序计数器指挥。
  4. 每个团队的指挥也会遇到一些权力以外的事情,当然就不管了。所以,当程序计数器遇到 Native方法时,就以表示,而遇到非本地方法,则记录正在执行的虚拟机字节码的地址。
  5. 团队没了指挥不管什么时候都是不行的,所以很定要有,所以程序计数器是java虚拟机中没有规定OutOfMemoryError情况的区域。

小节归纳:

  • 程序计数器 占用内存小线程私有
  • 控制指挥字节码解析器有条理执行每条指令。
  • 对Native方法,为空,非native,记录正在执行指令的地址。
  • 唯一没有规定OutOfMemoryError 的区域。

2.Java虚拟机栈(Java Virtual Machine Stacks)

描述:

  1. Java虚拟机栈就像客栈,客栈是私有财产,来了就要付钱,所以属于线程私有
  2. 每个到这个客栈来的客人都会提供一位服务人员一对一服务,指引登记入住,管理你的私人物品,引导你下一步做什么,记录你的需求,直到送你离开。 而每个客人就像一个方法,而服务人员就像栈帧,每个方法都对应一个栈帧用于存储局部变量表,操作数栈,动态链接,如服务人员为客人服务,每个方法从开始到结束,就如同客人入住到离开,服务人都会始终为你服务,而栈帧也正如此。对应在虚拟机中入栈出栈过程。

小节归纳:

  • 线程私有,同生共死
  • 每个方法会有一个栈帧进行服务,从创建直到销毁的整个过程
  • 栈帧作用:
    • 存储局部变量表
    • 操作数
    • 动态链接
    • 方法出口等。

java虚拟机运行时数据区(上)


两种异常

  1. *Error : 栈的深度大于虚拟机允许深度
  2. OutOfMemoryError: 能够动态扩容,但是不能申请更多的空间

局部变量表

在编译完成以后就确定大小,不会在运行期间不会改变。

解释:
局部变量表存储各种数据类型(基本和对象引用)所占用的大小都是固定的。不会因为不同的解释器等有所不同。
所以编译完成以后,大小就确定了。


3.本地方法栈(Native Method Stack)

描述:

本地方法栈与java虚拟机栈基本一致。

区别:

1.顾名思义,为本地方法(native) 服务
2. 本地方法栈中的实现语言不同。具体实现由具体虚拟机定。

补充:HotSpot虚拟机直接合二为一。


小节

程序计数器、java虚拟机栈,本地方法栈都是线程私有。


参考资料

  1. 深入理解Java虚拟机
  2. 马士兵JVM性能调优 公开课