JVM_1.3_运行时内存区域_本地方法栈

版权声明:本文为博主原创文章,可以转载,但请注明出处。 https://blog.csdn.net/Simba_cheng/article/details/82871781

运行时内存区域这块,如果不将内存各个区域做什么的了解清楚,后面看的会很累。

之前将JVM运行时内存区域的内容,整理在了一篇文章中。

在后续深入、细致的学习中,整理的内容越来越多,一篇的话,会导致篇幅过长。

所以将《JVM运行时内存区域详解》分为以下几个章节:

JVM_1.0_运行时内存区域_堆

JVM_1.1_运行时内存区域_Java虚拟机栈

JVM_1.2_运行时内存区域_方法区

JVM_1.3_运行时内存区域_本地方法栈

JVM_1.4_运行时内存区域_程序计数器

JVM_1.5_运行时内存区域_运行时常量池

这里将《Java虚拟机规范中文版》上传了,点击下面链接,即可下载

Java虚拟机规范SE7中文版下载

目录

本地方法栈

《深入理解Java虚拟机:JVM高级特性与最佳实践》

《Java Virtual Machine Specification Java SE 7 中文版》

《Java Virtual Machine's Internal Architecture》


本地方法栈

《深入理解Java虚拟机:JVM高级特性与最佳实践》

本地方法栈和Java虚拟机栈发挥的作用非常类似。

区别:

Java虚拟机栈 - 为虚拟机执行Java方法服务。

本地方法栈 - 为虚拟机使用到的Native方法服务。

Java虚拟机规范中对本地方法栈中方法所使用的语言、方式与数据格式并没有强制规定,因此具体的虚拟机可以自由实现。

例如 Sun HotSpot虚拟机,直接将本地方法栈与Java虚拟机栈合二为一。

《Java Virtual Machine Specification Java SE 7 中文版》

Java虚拟机实现可能会使用到传统的栈("C Stacks")来支持native方法的执行,这个栈就是本地方法栈

(Native方法:指使用Java以外的其他语言编写的方法)

当 Java 虚拟机使用其他语言(例如 C 语言)来实现指令集解释器时,也会使用到本地方法栈。

如果Java虚拟机不支持natvie方法,并且自己也不依赖传统栈的话,可以无需支持本地方法栈,如果支持本地方法栈,那这个栈一般会在线程创建的时候按线程分配。

《Java Virtual Machine's Internal Architecture》

https://www.artima.com/insidejvm/ed2/jvm9.html

本地方法本质上是依赖于实现的。

虚拟机实现的设计者可以自由地决定使用怎样的机制来让Java程序调用本地方法,任何本地方法接口都会使用某种本地方法栈。

当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java虚拟机栈,然而当他调用的是本地方法时,虚拟机只会保持Java虚拟机栈不变,而是简单地动态链接到并直接调用本机方法。

本地方法接口可能(再次由设计人员决定)能够回调到Java虚拟机栈并调用Java方法。在这种情况下,线程离开本地方法栈并进入另一个Java虚拟机栈。

下图展示:调用Java虚拟机栈和本地方法栈

如上图所示:

(1).线程首先调用上面两个Java方法,其中第二个调用本地方法。此操作导致Java虚拟机使用本地方法栈。

(此图中,本地方法栈显示为有限数量的连续内存空间;假设它是一个C堆栈,每个C-linkage函数使用的对战区域以灰色显示并由虚线界定)

(2).第一个C-linkage函数作为本地方法调用,调用第二个C-linkage函数。

(3).第二个C-linkage函数通过本地方法接口调用Java方法。

(4).这个Java方法,调用了另一个Java方法,即当前方法。

猜你喜欢

转载自blog.csdn.net/Simba_cheng/article/details/82871781
今日推荐