一、本地方法栈

1. 概述

类比Java栈管理 Java 方法的调用和执行,本地方法栈管理本地方法的调用。

2. 线程安全性

线程私有,每个线程独有一份。

3. 栈内存大小

运行被实现为内存固定大小可扩展内存大小。(内存溢出方面是相同的)

  • 线程请求分配的栈容量超过【本地方法栈】允许的最大容量,抛出StackOverFlowError。
  • 可动态扩展内存,扩展时候无法申请到足够内存,抛出OutOfMemoryError。

    4. 补充说明

  1. HotSpot虚拟机,本地方法栈(Native Method Stack)和虚拟机栈(Java Stack)合二为一。
  2. 并不是所有JVM都支持本地方法。 JVM规范没有明确要求本地方法栈的使用语言、具体实现方式、数据结构等。

    二、本地方法接口

    1. 概述

  3. 通过native关键字,不提供实现体,像是 Java 的 Interface 和实现类的关系,但实现体是其他语言编写

    • 其他语言也有一样的机制,比如C++中用【extern “c”】告知C++编译器去调用一个C的函数。
  4. 作用是融合不同的语言为 Java 所用,初衷是融合 C / C++ 程序。
  5. 当某个线程调用一个本地方法时候,本地方法不再受虚拟机限制。它和虚拟机拥有同样的权限。

    • 通过本地方法接口访问虚拟机内部的运行时数据区
    • 直接使用CPU的寄存器
    • 直接从本地内存的堆中分配任意数量的内存

      2. 用途

  6. JVM之外的环境交互。

  7. 操作系统交互。

    • JVM支持着Java语言本身和运行时库,但不是一个完整的操作系统,却经常依赖底层系统的支持。
    • 通过使用本地方法,我们可以通过Java底层系统交互。甚至,JVM的一些方法都是用C写的。

      3. 实例说明

  8. Sun的解释器是用C实现的,使得它能像普通的C一样与外部交互。

  9. Jre大部分是Java实现的,也通过一些本地方法与外界交互。

    • java.lang.Thread#setProperty()通过C语言实现,但是调用Thread中的本地方法可以运行

      4. 本地方法库

      1) 方法实现

      本地方法的其他语言实现

      2) 调用方式

      可以通过Java类中的native方法定义去调用

      3) 加载时机

      执行引擎执行时候加载本地方法库。

      5. 自定义本地方法

      可以自定义本地方法,并且可以编译通过。 ```java /**
    • 本地方法定义的演示类。

      1. native修饰的方法都没有方法体。

      1. native和abstract关键字不能同用。

    • a. native的方法实现体不是Java语言,但不表示没有。

    • b. abstract方法是 虚方法 / 抽象方法。

        *

    • @author Jinhua
    • @date 2020/10/29 22:41 */ public class IHaveNatives {

      public native void native1(int x);

      native static public long native2();

      native synchronized private float native3(Object o);

      native void native4(int[] array) throws Exception; } ```