Java程序运行原理
2019-12-28 本文已影响0人
依弗布德甘
- 编译生成.class字节码文件
- class文件内容
版本号
访问控制标志
常量池
构造方法
自定义方法
指令(参照指令表)
- JVM加载class分配数据区,存至方法区
jvm运行时数据区
线程共享: 所有线程都能方法这块内存数据,随虚拟机或GC而创建和销毁
- 方法区:存储加载类信息、常量、静态变量、编译后的代码等数据
- 堆内存:存储对象,细分为老年代、新生代
线程独占:每个线程都会有它独立空间,随线程生命周期创建和销毁
- 虚拟机栈:每个线程都有一个私有空间,有多个栈帧组成,一个方法对应一个栈帧
- 本地方法栈:只是为虚拟机使用Native本地方法而准备的,与虚拟机栈类似
- 程序计数器:记录当前线程执行字节码的位置,存储的是字节指令码地址,如果执行Native方法则计数器值为空。CPU同一时间只会执行一个线程中的指令,JVM多线程会轮流切换并分别CPU执行时间的方式,为切换线程后通过计数器来恢复正确的执行位置。
- JVM创建线程,运行代码
- 线程独占的空间
- jvm会根据方法描述,创建栈帧,通过程序计数器上当前的位置,执行字节码指令,对操作数栈和本地变量进行修改(如:本地变量数据压入栈,栈里面数据相加结果压入栈,栈中的数据保存至本地变量等)
- 每次执行都会记录当前线程执行的位置到程序计数器中,CPU切换线程后通过计数器来恢复执行位置