当前位置: 首页 > news >正文

JVM上篇:内存与垃圾-回收篇05-本地方法接口和本地方法栈

笔记来源:尚硅谷 JVM 全套教程,百万播放,全网巅峰(宋红康详解 java 虚拟机)

文章目录

  • 5. 本地方法接口和本地方法栈
    • 5.1. 什么是本地方法?
    • 5.2. 为什么使用 Native Method?
    • 5.2. 本地方法栈

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

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 中,直接将本地方法栈和虚拟机栈合二为一。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用MicroApp重构旧项目
  • Java中Map、List、Set操作
  • 24年上半年天融信营收缩减1.8亿,亏损2.06亿
  • Java-自定义注解中成员变量是Class<?>
  • Processing练习之变换颜色
  • eNSP 华为三层交换机配置DHCP
  • C system()函数调用删除Windows临时目录下的所有文件
  • 《AI音频类工具之九——Stable Audio​ 》
  • 【前端】NodeJS:项目上线
  • Ubuntu视频工具
  • 编程参考 - 头文件中使用static inline
  • Spring Cloud Gateway 请求转发源码分析
  • AI预测福彩3D采取888=3策略+和值012路或胆码测试8月17日新模型预测第59弹
  • 学习笔记--算法(滑动窗口)9
  • 2.1算法的时间复杂度与空间复杂度
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Docker 笔记(2):Dockerfile
  • ECMAScript6(0):ES6简明参考手册
  • iOS编译提示和导航提示
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • laravel with 查询列表限制条数
  • mongodb--安装和初步使用教程
  • PHP那些事儿
  • 反思总结然后整装待发
  • 复习Javascript专题(四):js中的深浅拷贝
  • 大数据全解:定义、价值及挑战
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • # windows 安装 mysql 显示 no packages found 解决方法
  • # 达梦数据库知识点
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (10)STL算法之搜索(二) 二分查找
  • (52)只出现一次的数字III
  • (HAL库版)freeRTOS移植STMF103
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (五)网络优化与超参数选择--九五小庞
  • (译) 函数式 JS #1:简介
  • (原創) 物件導向與老子思想 (OO)
  • (转) ns2/nam与nam实现相关的文件
  • (转) RFS+AutoItLibrary测试web对话框
  • ***利用Ms05002溢出找“肉鸡
  • . Flume面试题
  • .a文件和.so文件
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net core 外观者设计模式 实现,多种支付选择
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net Signalr 使用笔记
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET命令行(CLI)常用命令
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [20171106]配置客户端连接注意.txt