JVM概述
JVM在JAVA程序运行过程中,会将它所管理的内存划分为若干个不同的数据区域,在JVM启动时创建,或者随着线程的启动和结束来建立和销毁。
上图展示的是根据JAVA SE7规范,在JDK8版本中,方法区被移除,取而代之的是metaspace(元数据空间)
-
- 程序计数器
程序技术器是一个记录当前线程所执行字节码的型号指示器。
java代码编译后的字节码在未经过编译器前,执行方式是通过“字节码解释器”进行解释执行,工作原理为解释器读取装载入内存的字节码,按照顺序读取字节码指令,读取指令后,将该指令“翻译”成固定的操作,根据这些操作进行分支、循环、跳转、异常处理、线程恢复。
JVM的多线程实现方式是通过CPU时间片轮转算法来实现的,某个线程在执行过程中可能会因为时间片耗尽被挂起,另一个线程获取到时间片后开始实行,在任何一个确定的时间,一个处理器都只会执行一条线程中的指令,要保证线程切换后恢复到正确的执行位置,每条线程需要一个独立的程序计数器,程序计数器具备线程隔离的特性。
特点
- 线程隔离性,每个线程工作时都有属于自己的独立计数器。
- 执行java方法程序计数器时有值的,记录的是正在执行的字节码指令的地址。
- 执行Native本地方法时,程序计数器的值为空。
- 程序计数器占用内存小,在JVM进行计算时,可以忽略不计
- 程序计数器是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。