JVM运行时数据区——本地方法接口和本地方法栈

1、本地方法接口

虽然Java语言使用非常广泛,但是有些事务Java仍然无法处理。例如线程相关的功能,在线程类当中就有很多本地方法接口。那么Java如何来处理这些问题呢?Java设计师提出了一种解决方案就是本地方法接口。本贴将会讲解本地方法接口在Java语言中所起到的作用,以及为什么要使用本地方法接口。

1.1、本地方法接口概述

本地方法接口(Java Native Interface,JNI)在JVM中的位置,如下图所示:
在这里插入图片描述
图中的虚线框区域就是本地方法接口,负责和本地方法库、JVM之间的交互。

官方这样描述本地方法:“A method that is native and implemented in platform-dependent code,typically written in another programming language such as C.”意思是本地方法的实现一般是由其他语言编写的,比如可以使用C语言实现。我们可以理解为JNI就是使用Java语言调用非Java代码实现的接口。

JNI可以帮助Java代码与使用其他编程语言(例如C、C++和汇编)编写的应用程序和库进行交互。这个特征并非Java所特有,许多编程语言都有这一机制,比如在C++中,可以用extern '‘C’'告知C++编译器去调用一个C语言的函数。在定义一个Native Method时,并不提供实现体(类似只定义了Java Interface),因为其实现体是由非Java语言在外面实现的。

JNI最重要的好处是它对底层JVM的实现没有任何限制。因此,JVM供应商可以添加对JNI的支持,而不会影响JVM的其他部分。

本地方法接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序。例如Object类的getClass()方法,它是有方法体的,不过方法体的具体实现并不是Java语言实现的,主要是C/C++语言实现的,如下图所示:
在这里插入图片描述
如下代码清单所示,演示了本地方法的格式:
在这里插入图片描述
由上述代码示例可知,每个方法都是用native修饰,并且都没有方法体(具体的方法体由非Java代码实现),表示该方法为本地方法。需要注意的是该方法并不是抽象方法。标识符native可以与所有其他的Java标识符连用,但是abstract除外。

上面介绍了什么是Native Method,但是为什么要使用Native Method呢?下面将会从三个方面介绍Java中为什么使用Native Method。

(1)减少重复劳动。有时Java应用需要与Java外面的环境交互,这是本地方法存在的主要原因。如果本地已经有一个用另一种语言编写的库,这时候希望通过某种方式使其可供Java代码访问,而不是重新使用Java语言编写一套功能一样的库,那么这种方式就是JNI。例如,Java需要与一些底层系统交互时,本地方法为我们提供了一个非常简洁的接口,而且我们无须去了解Java应用之外的烦琐的细节。要不然底层系统的厂商还需要提供一套Java形式的类库,这样就是重复劳动了。

(2)标准Java类库不支持应用程序所需的平台相关特性。JVM支持Java语言本身和运行时库,它是Java程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎样,它毕竟不是一个完整的系统,它经常依赖一些底层系统的支持,这些底层系统常常是强大的操作系统。通过本地方法,我们可以使用Java自身的JRE与底层系统进行交互,甚至JVM的部分实现就是用C语言编写的。还有,如果我们要使用一些Java语言本身没有提供封装的操作系统的特性时,也需要使用本地方法。

(3)性能要求。假如想用较低级别的语言(例如汇编)实现一小部分性能要求严格的代码,这时候就可以使用到JNI了。目前本地方法的使用越来越少,在企业级应用中已经比较罕见,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备。因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用Web Service,等等。

1.2、小结

我们可以看出Java语言中的部分方法并非由Java实现,这类方法的存在使Java与外界环境的交互更加方便快捷。Java为我们提供的简洁的本地方法接口,不仅使我们无须去了解Java应用之外的烦琐细节,还增加了Java语言的扩展性。

2、本地方法栈

重点讲解运行时数据区中的本地方法栈区域,包括本地方法栈的概念,以及本地方法栈中可能发生的异常情况。

2.1、本地方法栈概述

Java虚拟机实现可能会使用到传统的栈(通常称为C Stack)来支持本地方法(使用Java语言以外的其他语言编写的方法)的执行,这个栈就是本地方法栈(Native Method Stack)。

本地方法栈和Java虚拟机栈发挥的作用是类似的,它们直接的区别是Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用,如下图所示:
在这里插入图片描述
本地方法栈是线程私有的。本地方法栈的大小允许被实现成固定大小的或者是可动态扩展的。在内存溢出方面,它与Java虚拟机栈也是相同的。

如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverflowError异常。

如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将会抛出一个OutOfMemoryError异常。

它的具体做法是在Native Method Stack中登记本地方法,在Execution Engine执行时加载本地方法库。

当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。它和虚拟机拥有同样的权限,如下3项表示本地方法可能涉及的权限调用:

  • 本地方法可以通过本地方法接口来访问运行时数据区中的其他区域。
  • 本地方法甚至可以直接使用本地处理器中的寄存器。
  • 本地方法可以直接从本地内存的堆中分配任意数量的内存。

并不是所有的JVM都支持本地方法,因为Java虚拟机规范并没有明确要求本地方法栈的使用语言、具体实现方式、数据结构等。如果JVM产品不打算支持本地方法,也可以无须实现本地方法栈,如果支持本地方法栈,那这个栈一般会在线程创建的时候按线程分配。

在Java中,本地方法栈和虚拟机栈是如何关联的呢?如下图所示:
在这里插入图片描述
当调用线程的start()方法的时候,在当前线程中开辟一个start()方法的栈帧并压入栈,在start()方法中又调用了start0()方法(图中画框处)。start0()方法是一个本地方法,所以start0()方法需要通过本地方法栈调用,可以使用动态链接的方式直接指向本地方法,由执行引擎来执行该本地方法。类似的案例还有Java应用中连接MySQL数据库或者Redis数据库等。

2.2、小结

本地方法栈用于管理本地方法的调用,但是本地方法依赖JVM的实现,有的JVM并不支持本地方法,HotSpot虚拟机是支持的。Java虚拟机规范允许本地方法栈实现成固定的大小,或者根据计算来实现动态扩展和收缩。本地方法栈可能会发生StackOverflowError和OutOfMemoryError异常情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2822295.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

vscode 引入外部依赖包

背景 我要在vscode中写一些antlr代码生成的cpp代码,但是在引入头文件#include "antlr4-runtime.h"的时候,出现报错,显示没有这个头文件,显然这是我们没有导入相关的包,因此我首先尝试了将antlr4的依赖源码在…

把简单留给用户,把复杂交给 AI

2024 年伊始,Kyligence 联合创始人兼 CEO 韩卿(Luke)分享了对 AI 与数据行业的一些战略思考,以及对中美企业服务市场的见解,引发业界同仁的广泛共鸣。正值 Kyligence 成立 8 周年,恰逢 AI 技术应用风起云涌…

SpringBoot+aop实现主从数据库的读写分离

读写分离的作用是为了缓解写库,也就是主库的压力,但一定要基于数据一致性的原则,就是保证主从库之间的数据一定要一致。如果一个方法涉及到写的逻辑,那么该方法里所有的数据库操作都要走主库。 一、环境部署 数据库:…

二叉搜索树在线OJ题讲解

二叉树创建字符串 我们首先进行题目的解读: 大概意思就是用()把每个节点的值给括起来,然后再经过一系列的省略的来得到最后的结果 大家仔细观察题目给出的列子就可以发现,其实这个题目可以大致分为三种情况&#xff1…

【OpenGL编程手册05】纹理渲染

目录 一、说明二、概述三、纹理环绕方式四、纹理过滤五、多级渐远纹理六、加载与创建纹理七、生成纹理八、应用纹理九、纹理单元练习 一、说明 我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果…

文本多分类

还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_ernir 文本分类-CSDN博客 /usr/bin/python3 -m pip install --upgrade pip python3-c"import platform;print(platform.architecture()[0]);print(platform.machine…

Linux--Redis 群集

9.1.1 关系型数据库与非关系型数据库 数据库按照其结构可以分为关系型数据库与其他数据库,而这些其他数据库我们将其统称为非 关系型数据库。Redis数据库是一个非关系型数据库。 1、关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型基础上…

MATLAB练习题:排队论问题的模拟

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 下面我们来看一道排队论的题目。假设某银行工作时间内只有一个…

硬盘坏了怎么把数据弄出来?数据恢复方法推荐

在数字化时代电脑硬盘中的数据承载着我们的工作成果、生活回忆和珍贵资料。然而一旦硬盘出现故障,数据的安全就变得岌岌可危。那么当电脑硬盘出现问题时,我们真的无法挽回那些重要数据了吗?答案是:不一定!本文将为您介…

【GPU驱动开发】- AST简介

前言 不必害怕未知,无需恐惧犯错,做一个Creator! AST,抽象语法树,是一种包含丰富语义信息的格式,其中包括类型、表达式树和符号等。 TranslationUnitDecl:该类表示一个输入源文件 ASTContext&…

Socket网络编程(六)——简易聊天室案例

目录 聊天室数据传输设计客户端、服务器数据交互数据传输协议服务器、多客户端模型客户端如何发送消息到另外一个客户端2个以上设备如何交互数据? 聊天室消息接收实现代码结构client客户端重构server服务端重构自身描述信息的构建重构TCPServer.java基于synchronize…

Android 12.0 framework关于systemUI定制之导航栏透明背景的功能实现

1.概述 在12.0的系统rom产品定制化开发中,在对于系统原生SystemUI的导航栏背景在沉浸式导航栏的 情况下默认是会随着背景颜色的变化而改变的,在一些特定背景下导航栏的背景也是会改变的,所以由于产品开发需要 要求需要设置导航栏背景为透明的,所以就需要在Activity创建的时…

第十五天-爬虫项目实战

目录 1.介绍 2.代码 1.main.py 2.PageSider.py 3.DetailSpider.py 4.DataParse.py 5.Constant.py 6.HanderRequest.py 1.介绍 1. 使用多线程爬取网站 2.爬取数据后保存至excel 3.爬取网站(仅做测试)网创类项目爬取:https://www.maomp.com/ 4..实现效果 …

Java已死?凛冽寒风,刺骨现实

文章首发于公众号:职谷智享 2024年,寒风凛冽,不仅吹进了人们的衣领,也吹进了程序员的心里。曾经风光无限的Java,如今似乎正在走向末路。 招聘需求骤减,求职者如过江之鲫 猎聘网的数据显示,20…

Linux 任务进程命令练习

1、通过ps命令的两种选项形式查看进程信息 2、通过top命令查看进程 3、通过pgrep命令查看sshd服务的进程号 4、查看系统进程树 5、使dd if/dev/zero of/root/file bs1M count8190 命令操作在前台运行 6、将第5题命令操作调入到后台并暂停 7、使dd if/dev/zero of/root/file2 bs…

Flutter中Future和Stream关系

Future和Stream类是Dart异步编程的核心。 Future 表示一个不会立即完成的计算过程。与普通函数直接返回结果不同的是异步函数返回一个将会包含结果的 Future。该 Future 会在结果准备好时通知调用者。 Stream 是一系列异步事件的序列。其类似于一个异步的 Iterable,…

力扣SQL50 大的国家 查询

Problem: 595. 大的国家 Code select name,population,area from World where area > 3000000 or population > 25000000;

国外站群服务器科普:定义、用途与价值

在数字化时代,服务器扮演着至关重要的角色,而站群服务器则是其中的一种特殊形态。尤其对于需要在全球范围内进行业务部署的企业或个人来说,国外站群服务器成为了不可或缺的工具。那么,国外站群服务器究竟是什么呢?它有哪些用途呢…

【Web安全靶场】sqli-labs-master 54-65 Challenges 与62关二分法和like模糊搜索

sqli-labs-master 54-65 Challenges 其他关卡和靶场见专栏… 文章目录 sqli-labs-master 54-65 Challenges第五十四关-联合注入第五十五关-联合注入第五十六关-联合注入第五十七关-联合注入第五十八关-报错注入第五十九关-报错注入第六十关-报错注入第六十一关-报错注入第六十…

抖音视频评论批量采集软件|视频数据提取工具

开发背景: 随着抖音视频的流行和使用频率增加,用户对批量采集抖音视频评论的需求逐渐凸显。传统的下载方式效率低下,无法满足快速采集数据的要求。为了解决这一问题,我们开发了一款基于C#的抖音视频评论批量采集软件,旨…