内存区域图示Java虚拟机在运行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间,有的区域随着Java虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而创建和销毁。
--摘自《深入理解Java虚拟机》
程序计数器(program counter)
学过线程的同学应该了解,Java的多线程是通过CPU不断在线程之间切换来实现的,那么我们不禁要问:当线程的指令并没有执行完毕,却因为时间片耗尽而失去了CPU使用权,又该如何从挂起的地方继续执行呢?关于这个问题,不得不提到一个概念,就是程序计数器(program counter)。
JVM中通过程序计数器来记录当前字节码的执行位置,使已经挂起的线程重新获得CPU使用权后,依旧能够继续往下执行。讲解完了用途之后,我们总结一下程序计数器的几个特点:
-
线程隔离性:每个线程都有一个自己的程序计数器,彼此隔离,互不影响。
-
执行Native方法时,程序计数器值为空,原因是native方法是通过jni调用的C/C++库,与字节码无关。
-
生命周期随着线程,线程启动而产生,线程结束而消亡。
-
由于存储的是字节码地址,在创建时JVM就会为其分配一个足够大的内存,所以没有规定任何OutOfMemoryError。
源码与字节码
网友评论