运行时内存区域这块,如果不将内存各个区域做什么的了解清楚,后面看的会很累。
之前将JVM运行时内存区域的内容,整理在了一篇文章中。
在后续深入、细致的学习中,整理的内容越来越多,一篇的话,会导致篇幅过长。
所以将《JVM运行时内存区域详解》分为以下几个章节:
这里将《Java虚拟机规范中文版》上传了,点击下面链接,即可下载
目录
《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方法,即当前方法。