1. JVM 的整体结构
![image-20200519085324007](https://typora-1301918612.cos.ap-guangzhou.myqcloud.com/undefined/202005/19/085326-639726.png)
详细图:
![image-20200519085426424](https://typora-1301918612.cos.ap-guangzhou.myqcloud.com/undefined/202005/19/085428-72625.png)
上图中,我们可以根据位置,暂且分为三层结构。
1.1上层:
Java虚拟机是用来解释运行字节码文件的,所以它的入口原材料是 Class Files, 字节码文件首先要经过类装载器子系统(Class Loader SubSystem),类装载器子系统的作用就是将class files 文件加载到内存中,生成一个大的class 对象。 在这个过程中,就会涉及到加载(loading)、链接(Lingking)、初始化(Initialization)。
1.2中层:
运行时数据区(Runtime Data Area)。当字节码文件经过类装载器子系统时,会把它管理的内存划分为若干个不同的数据区域。这些区域各有各自的用途、以及创建时间和销毁时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。
在多个线程当中,它们是共享方法区和堆的;对于Java虚拟机栈、本地方法栈以及程序计数器是每个线程单独拥有一份的
下面进行单独讲解这几块区域:
1.2.1.程序计数器
线程私有 **占据一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器。**在虚拟机概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。
由于jvm的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令。因此未来线程切换后能恢复到