①. 程序计数器
- ①. 作用 (是用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令)
- ②. 特点(是线程私有的 、不会存在内存溢出)
- ③. 注意:在物理上实现程序计数器是在寄存器实现的,整个cpu中最快的一个执行单元
- ④. 它是唯一一个在java虚拟机规范中没有OOM的区域
解释:
(1). 每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记
(2). 这块内存区域很小,它是当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令
(3). 如果执行的是一个Native方法,那这个计数器是undefined
⑤. 使用PC寄存器存储字节码指令地址有什么用呢?
为什么使用PC寄存器记录当前线程的执行地址呢?
- 因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行
- JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令
⑥. PC寄存器为什么设定为线程私有?
(为了能够准确记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器)
⑦. 关于线程在JVM中的说明:
在Hotspot JVM里,每个线程都与操作系统的本地线程直接映射
(解释:当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建.Java线程执行终止后,本地线程也会被回收)
操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化完毕,
它就会调用Java线程中的run方法
②. 本地方法栈
- ①. Native Interface本地接口
本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序,Java诞生的时候是C/C++横行的时候,要想立足,必须由调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies
目前该方法的使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用中已经比较少见。因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用Web Service等等,不多做介绍
②. 本地方法栈(Native Method Stack)
(它的具体做法是Native Method Stack中登记native方法,在Execution Engine 执行时加载本地方法库)
③. native方法的举例: Object类中的clone wait notify hashCode 等 Unsafe类都是native方法