Java线程执行native方法时程序计数器为空,如何确保native执行完后的程序执行的位置

絮叨

今天在看深入理解Java虚拟机这本书的时候,里面有这句话,如果正在执行的是Native方法,这个计数器值为空(Ubdifined)。

看完之后有一点不理解,native方法执行时,程序计数器为空,那执行后,怎么确保接下来执行的位置?这个问题查看了一些资料,在这里参考R大的回答做一个小总结。

R大的回答:https://www.zhihu.com/question/40598119/answer/87381512

正文

首先我们来看一下在JVM规范中,这句话是怎么形容的

If the method currently being executed by the thread is native, the value of the Java Virtual Machine's pc register is undefined 

翻译过来就是如果一个线程执行的是Native方法,Java虚拟机中程序计数器的值未定义

在程序计数器的定义中,程序计数器存放的是Java字节码的地址,而native方法的方法体是非Java的,所以程序计数器的值才未定义。

那在native方法执行后,线程又如何确保下一次执行的位置?

这是因为每个Java线程都直接映射到一个OS线程上执行。所以native方法就在本地线程上执行,无需理会JVM规范中的程序计数器的概念。仔细看一下JVM规范,如果一个线程执行Native方法,程序计数器的值未定义,可不是一定为空,任何值都可以。native方法执行后会退出(栈帧pop),方法退出返回到被调用的地方继续执行程序。

Tip: OS意思是操作系统(Operating System)的简写。

你可能感兴趣的:(JVM,Java)