一、Native
Native 一般是指本地的,在Java 源码中如果看到某个方法被Native修饰,那就是代表只能调用底层C 语言处理逻辑。
编写一个多线程启动类
public static void main(String[] args) {
new Thread(() -> {},"Thread1").start();
}
点进去start方法
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0(); // 调用了start0()方法
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
// 凡是带了native关键字的,就说明Java的作用范围达不到了,会去调用底层C语言的库
private native void start0(); //start0()方法的定义,这个方法会调用底层C
Java在内存区域中专门开辟了一块标记区域——本地方法栈,用来登记native方法,凡是带了native关键字的,会进入到本地方法栈中,调用本地方法接口(JNI),在最终执行的时候,加载本地方法库中的方法通过JNI
- JNI的作用:扩展Java的使用,融合不同的编程语言为Java所用,不过最初是想融合C,C++的,因为Java诞生的时候,C,C++横行,想要立足的话就要有能调用C的程序
- 本地方法栈:具体做法是,在Native Method Stack中登记native方法,在执行引擎执行的时候加载Native Libraies【本地库】
二、PC寄存器
程序计数器:Program Counter Register
每个线程都有一个程序计数器, 是线程私有的,就是一个指针, 指向方法区中的方法字节码(用来存储指向一条指令的地址, 也是即将要执行的指令代码),在执行引擎读取下一条指令, 是一个非常小的内存空间,几乎可以忽略不计
三种JVM
- Sun公司
HotSpot Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
- BEA
JRockit
- IBM
J9VM