一.运行时数据区域
java虚拟机管理的内存将会包括以下几个运行时数据区域
1. 程序计数器
程序计数器(program counter register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。
在虚拟机概念模型里,字节码解释器通过改变计数器的值来选取下一条需要执行的字节码指令。分支,循环,跳转,异常处理,线程恢复等基础功能都依赖程序计数器完成
线程私有的内存:因为java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来执行的。在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令。因此,为了线程切换之后能恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,这块内存区域称为线程私有的内存
若线程操作如下:
线程a读取文件a
线程b读取文件b
线程a处理文件a
线程b处理文件b
如果是线程独立的计数器,当线程b切换到线程a的时候,线程a可以知道自己之前执行的是什么操作,接下来该执行什么操作
如果是共享的计数器,当存在多个线程的时候,比如第一次执行a线程,中间切换执行了数百个线程,要切换到a线程的时候,需要遍历计数器找到上次a线程的执行状态,频繁的切换线程,查找线程状态是极其消耗时间和内存的。
如果线程执行的是一个java方法,计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Native方法,这个计数器值则为空,程序计数器区是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域