Java中字节码执行过程

我们都知道Java是一个解释语言,将字节码解释为机器码然后运行。
这篇文章我们就说下具体的细节。

说明:以下观点是我结合网络上的观点自己总结的,可能会存在错误,望大佬批评指正!

执行过程:

我们都知道一个字节码肯定是属于某个线程的,程序的基本运行单位就是线程。在JVM中一个线程对应着一个虚拟机方法栈、本地方法栈和PC计数器(记录字节码的位置)。
在这里插入图片描述
上图就是虚拟机方法栈的结构,本地方法栈的结构和虚拟机方法栈大概一致。

一个栈帧对应着一个方法,里面存放着有方法对应的字节码代码,字节码是无法直接执行的。

一个JVM对应着一个进程。JVM是由C++写的,JVM的主线程对应着一个C++线程,这个线程找到Java中的主类然后执行对应的main()方法的字节码。

对应的C++线程会每次通过PC计数器来找到当前要执行的字节码代码,然后将字节码代码解释翻译为机器码,然后执行,执行完毕后,然后将PC计数器+1,接着解释翻译执行,直到代码执行完毕,线程死亡!

1、在调用本地方法前,会将CPU中关于虚拟机方法栈的执行状态信息保存到本地方法栈中,以便后续本地方法调用完成后继续执行当前虚拟机方法。

当调用本地方法时,会将本地代码栈中填入对应的代码然后执行,PC计数器会置为undefined,不断执行本地方法代码,执行完毕后通过之前写入的虚拟机栈状态信息来恢复CPU中关于虚拟机栈方法的执行现场。

2、当Java中的新建一个线程对象的时候会新建一个C++线程,就跟JVM的主线程一致,也会不断获取Java线程对象对应字节码,然后不断执行。

这个C++线程就对应着操作系统中的一个TCB,会通过操作系统进行CPU调度。当一个线程被CPU调度执行的时候,会找到对应的字节码,然后解释执行。

说白了,JVM就是若干个字节码解释器,字节码解释器通过程序计数器来不断解释字节码执行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值