Native Interface本地接口
本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序,Java诞生的时候,是C/C++横行的时候,要想立足,必须要有调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libralies。
目前该方法使用的越来越少,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用已经比较少见。因为现在的异构领域间的通讯很发达,比如可以使用Socket通信,也可以使用Web Service等等。
package com.lichi;
/**
* @author lichi
* @create 2021-07-22 8:58
*/
public class T2 {
public static void main(String[] args) {
Thread t1 = new Thread();
t1.start();
t1.start();
// Exception in thread "main" java.lang.IllegalThreadStateException
// private native void start0(); native方法说明已经不在java范围内,需要调用系统底层
// native方法放到native栈中运行(Java诞生于1995年,那个时候语言牛逼?C语言)
}
}
Native Method Stack
它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载本地方法库。
PC寄存器(程序计数器)
每个线程都有一个程序计数器。是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记。
这块内存区域很小,它是当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。
如果执行的是一个Native方法,那这个计数器是空的。
用以完成分支、循环、跳转、异常处理、线程恢复等基础功能。不会发生内存溢出:OutOfMemory==OOM
说白了:就是一个指针,一个方法运行完,指向下一个方法,依次执行!有点类似排班表
方法区(Method Area)—存在垃圾回收
供各线程共享的运行时的内存区域。它存储了每一个类的结构信息(也就是所谓的模板,也就是Class),例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容。上面讲的是规范,在不同虚拟机里头实现是不一样的,最典型的就是永久代(PermGen space)和元空间(Metaspace)。
java7的时候:方法区 f = new 永久代
java8的时候:方法区 f = new 元空间
但是:实例变量存在堆内存中,和方法区无关。