5. 本地方法接口和本地方法栈

news2024/11/27 17:53:33

5.1. 什么是本地方法?

简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C中,你可以用extern “c” 告知c编译器去调用一个c的函数。

A native method is a Java method whose implementation is provided by non-java code.

在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。

本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序。
在这里插入图片描述

public class IHaveNatives{
    public native void methodNative1(int x);
    public native static long methodNative2();
    private native synchronized float methodNative3(Object o);
    native void methodNative4(int[] ary) throws Exception;
}

标识符native可以与其它java标识符连用,但是abstract除外

5.2. 为什么使用Native Method?

Java使用起来非常方便,然而有些层次的任务用Java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。

与Java环境的交互

有时Java应用需要与Java外面的环境交互,这是本地方法存在的主要原因。你可以想想Java需要与一些底层系统,如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解Java应用之外的繁琐的细节。

与操作系统的交互

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

Sun’s Java

Sun的解释器是用C实现的,这使得它能像一些普通的C一样与外部交互。jre大部分是用Java实现的,它也通过一些本地方法与外界交互。例如:类java.lang.Thread的setPriority()方法是用Java实现的,但是它实现调用的是该类里的本地方法setPriority()。这个本地方法是用C实现的,并被植入JVM内部,在Windows 95的平台上,这个本地方法最终将调用Win32 setPriority() ApI。这是一个本地方法的具体实现由JVM直接提供,更多的情况是本地方法由外部的动态链接库(external dynamic link library)提供,然后被JVw调用。

现状

目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用中已经比较少见。因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用Web Service等等,不多做介绍。

5.2. 本地方法栈

Java虚拟机栈于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。

本地方法栈,也是线程私有的。

允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的)

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

本地方法是使用C语言实现的。

它的具体做法是Native Method Stack中登记native方法,在Execution Engine 执行时加载本地方法库。
在这里插入图片描述
当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。它和虚拟机拥有同样的权限。
本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区。
它甚至可以直接使用本地处理器中的寄存器直接从本地内存的堆中分配任意数量的内存。
并不是所有的JVM都支持本地方法。因为Java虚拟机规范并没有明确要求本地方法栈的使用语言、具体实现方式、数据结构等。如果JVM产品不打算支持native方法,也可以无需实现本地方法栈。
在Hotspot JVM中,直接将本地方法栈和虚拟机栈合二为一。

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

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

相关文章

云贝餐饮连锁独立版 v2.7.9+公众号+小程序端+全插件(免授权前端线传)安装教程

云贝餐饮连锁版主要基于目前比较流行小程序生态下的自助点单系统,一款非常不错的餐饮外卖小程序。播播资源测试云贝餐饮连锁独立版 v2.7.9该版本与上一版一样永久授权版,增加了小程序前端线传功能(通过其他第三方上传)&#xff0c…

jdk17下netty导致堆内存疯涨原因排查 | 京东云技术团队

背景: 介绍 天网风控灵玑系统是基于内存计算实现的高吞吐低延迟在线计算服务,提供滑动或滚动窗口内的count、distinctCout、max、min、avg、sum、std及区间分布类的在线统计计算服务。客户端和服务端底层通过netty直接进行tcp通信,且服务端…

JS判断对象是否发生变化,常用于监听页面表单是否修改并给出保存提示

本文主要封装方法,实现用户离开表单编辑页面时弹出提示框,若表单数据发生变化,则提示用户是否保存当前页面的信息,如图: 封装方法: /*** 比较俩个对象之间的差异,项目中多处用到监听表单数据是…

配电室能耗数据采集系统

随着社会的快速发展,能源消耗逐年增加,能源问题已成为制约我国经济社会发展的瓶颈。在此背景下,节能减排、绿色发展成为国家战略,而配电室作为电力系统的重要组成部分,其能耗管理对整个电力系统的能效有着举足轻重的影…

SQL sever中表数据管理

目录 一、插入数据: 二、更新数据: 三、删除数据: 四、清空数据: 4.1使用DELETE语句: 4.2 使用TRUNCATE TABLE语句: 4.3区别: 4.3.1DELETE FROM: 4.3.2TRUNCATE TABLE&am…

正文—态路小课堂丨光模块安装与拆卸的小指南

点击蓝字 | 关注我们 TARLUZ态路 光模块通常由非常精密的光学元件组成,对于光信号的接收和发射非常敏感。静电和光口污染对光模块信号传输有着很大的影响。静电会导致光模块器件的性能降低、寿命缩短,可能会造成不可逆的损坏。光口污染会导致光信号的衰…

“海葵”强势来袭,台风天如何做好防涝排水工作?

中央气象台9月4日06时发布台风黄色预警:今年第11号台风“海葵”(HAIKUI)的中心已于昨天(9月3日)晚上7点50分前后移入台湾海峡南部海面。 预计,“海葵”将以每小时10公里左右的速度向西偏北方向移动&#xf…

提振印度市场?iPhone15首发之一,富士康工厂将提前生产iPhone15

根据金融时报的报道,苹果公司计划将印度作为其新款 iPhone 15 的首发市场之一。以往的经验显示,印度市场通常会比其他市场延迟一个月左右才能上市,但今年情况将发生变化。据报道,位于印度东南部城市金奈的富士康工厂计划在9月中旬…

浅析安防视频监控平台EasyCVR视频融合平台接入大量设备后是如何维持负载均衡的

安防视频监控平台EasyCVR视频融合平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备…

qemu/kvm学习笔记

qemu/kvm架构 cpu虚拟化的示例 Reference: kvmtest.c [LWN.net] 主要步骤: QEMU通过/dev/kvm设备文件发起KVM_CREATE_VM ioctl,请求KVM创建一个虚拟机。KVM创建虚拟机相应的结构体,并为QEMU返回一个虚拟机文件描述符QEMU通过虚拟机文件描述…

【每日一题】54. 螺旋矩阵

54. 螺旋矩阵 - 力扣(LeetCode) 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5…

电脑内存不足怎么办?分享4个释放空间小妙招!

“我的电脑好像也没有保存什么很大的文件,为什么总会显示电脑内存不足呀?现在电脑非常的卡,有什么好用的方法可以快速清理电脑内存吗?希望大家给我出出主意!” 我们在使用电脑时,可能电脑悄悄地保存了很多的…

线下沙龙 | 从营销扩张到高效回款,游戏公司如何通过全链路运营实现高质量出海!

游戏出海,是近些年来中国产业的风暴出口,在2020至2023年期间保持着绝对的领航地位。公开数据显示,过去4年里,游戏在各类App出海份额中总体保持稳定,高达 64.9%。 但毕竟海外是陌生的市场,我们见过太多折戟沉…

Windows——安装 Microsoft 便签

打开 Microsoft Store。 搜索 Microsoft 便签,点击安装。

How to clean up Graylog Default index set log

一、前言: Graylog 满了,没有自动清理 挤爆硬盘空间,手动清理流程: 二、问题描述: Elasticsearch nodes disk usage above high watermark (triggered a few seconds ago)mree are ast search modes i the use wtm a mos mo re disk ther dsk s saoe me e waemak f ths…

ant vue3 自定义table一行两列

效果图 table代码 <a-tablesize"small":columns"columns":row-key"(record, index) > index 1":data-source"tableInfo.data":pagination"false"change"handleTableChange"resizeColumn"handleResiz…

Hashtable和HashMap、ConcurrentHashMap 之间的区别

Hashtable和HashMap的区别 HashMap和Hashtable都是哈希表数据结构&#xff0c;但是Hashtable是线程安全的&#xff0c;HashMap是线程不安全的 Hashtable实现线程安全就是简单的把关键方法都加上了synchronized关键字 直接在方法上添加synchronized相当于针对this对象&#xff0…

Linux cat 的作用

Linux中的cat命令用于连接文件并打印到标准输出设备&#xff08;通常是终端&#xff09;。 它的主要作用有以下几点&#xff1a; 查看文件内容&#xff1a;cat命令可用于查看文本文件的内容&#xff0c;将文件的内容从第一行到最后一行打印到终端。 合并文件&#xff1a;cat命…

你们真的感觉Python那么好用吗?

最近一些工作需要用Python来做&#xff0c;我把我遇到的不开心说出来让大家开心开心。PYTHON是一门很伟大的语言&#xff0c;而且有很多有用的框架都是用PYTHON写的&#xff01;这只是我个人的感受不一定对&#xff0c;别太认真。就当一个故事听&#xff01; 先说我一些库装了以…

ChatGPT追祖寻宗:GPT-1论文要点解读

论文地址&#xff1a;《Improving Language Understanding by Generative Pre-Training》 最近一直忙着打比赛&#xff0c;好久没更文了。这两天突然想再回顾一下GPT-1和GPT-2的论文&#xff0c; 于是花时间又整理了一下&#xff0c;也作为一个记录~话不多说&#xff0c;让我们…