博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM体系结构之五:本地方法栈
阅读量:6733 次
发布时间:2019-06-25

本文共 840 字,大约阅读时间需要 2 分钟。

 

对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,但不止如此,它还可以做任何它想做的事情。

  本地方法本质上时依赖于实现的,虚拟机实现的设计者们可以自由地决定使用怎样的机制来让Java程序调用本地方法。

  任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持Java栈不变,不再在线程的Java栈中压入新的帧,虚拟机只是简单地动态连接并直接调用指定的本地方法。

  如果某个虚拟机实现的本地方法接口是使用C连接模型的话,那么它的本地方法栈就是C栈。当C程序调用一个C函数时,其栈操作都是确定的。传递给该函数的参数以某个确定的顺序压入栈,它的返回值也以确定的方式传回调用者。同样,这就是虚拟机实现中本地方法栈的行为。

  很可能本地方法接口需要回调Java虚拟机中的Java方法,在这种情况下,该线程会保存本地方法栈的状态并进入到另一个Java栈。

  下图描绘了这样一个情景,就是当一个线程调用一个本地方法时,本地方法又回调虚拟机中的另一个Java方法。

  这幅图展示了JAVA虚拟机内部线程运行的全景图。一个线程可能在整个生命周期中都执行Java方法,操作它的Java栈;或者它可能毫无障碍地在Java栈和本地方法栈之间跳转。 

 

该线程首先调用了两个Java方法,而第二个Java方法又调用了一个本地方法,这样导致虚拟机使用了一个本地方法栈。假设这是一个C语言栈,其间有两个C函数,第一个C函数被第二个Java方法当做本地方法调用,而这个C函数又调用了第二个C函数。之后第二个C函数又通过本地方法接口回调了一个Java方法(第三个Java方法),最终这个Java方法又调用了一个Java方法(它成为图中的当前方法)。

转载地址:http://mnfqo.baihongyu.com/

你可能感兴趣的文章
金融企业从自建MySQL数据库迁移RDS方案
查看>>
ILOG JViews Diagrammer使用记录
查看>>
Qt QGroupBox StyleSheet 边框设置
查看>>
BZOJ 1088: [SCOI2005]扫雷Mine【思维题,神奇的模拟+枚举】
查看>>
Android 测试工具集02
查看>>
memcached的分布式
查看>>
打包发布自己的nodejs包
查看>>
oracle、mysql、sybase和sqlserver复制表结构和数据
查看>>
[Everyday Mathematics]20150111
查看>>
[转载]Linux shell中的竖线(|)——管道符号
查看>>
Python 装饰器笔记
查看>>
定时组件quartz系列<三>quartz调度机制调研及源码分析
查看>>
塞北三朝
查看>>
Effective Python 中文版
查看>>
恢复Reflector反编译后资源文件的办法
查看>>
GSM Hacking Part① :使用SDR扫描嗅探GSM网络
查看>>
安装完eclipse,dbwear后,需要在他们解压文件.ini下加上你liux的jdk的安装路径,才能正常使用...
查看>>
流量排名前一千万网站,三分之一使用 WordPress
查看>>
聊聊并发——深入分析ConcurrentHashMap
查看>>
Unable to find the Xcode project `.xcodeproj` for the target `Pods`
查看>>