目录
[二. PC 计数器:线程的"书签"](#二. PC 计数器:线程的“书签”)
一.什么是Native关键字?
1.名字的含义
Native 这个英文单词,本意是**"本地的"、"原生的"、"土著的"**。
你可以这样理解:
- Java 代码 :就像是一个**"外来户"**。因为它运行在虚拟机(JVM)里,是被隔离起来的,不管是在 Windows 还是 Mac 上,Java 看到的都是同一个虚拟环境,它并不真正属于这个操作系统。
- Native 代码 :就像是**"本地土著"**。它是用 C 或 C++ 写的,直接运行在操作系统(Windows/Linux)上,它是这个系统真正的"本地人",熟悉这里的一草一木(硬件、文件、驱动)。
所以,
native关键字的含义就是:告诉 Java:"这个方法别在虚拟机里瞎琢磨了,直接去呼叫本地土著(操作系统底层)来帮忙解决。"
2.JNI的含义
即:Java Native Interface ,翻译过来就是 Java本地接口。
3.JNI在JVM的位置

4.JNI(或者叫native关键字)的作用
让 Java 代码能够突破虚拟机的限制,直接调用操作系统底层的 C/C++ 库,从而实现对硬件(如打印机)的精准控制。
5.代码演示
使用native关键字,调用硬件(比如打印机)。
java
public class PrinterController {
// 1. 定义 native 方法
// 作用:告诉 Java,我要打印这段指令,但具体怎么发,我不管,交给 native
public native void printLabel(String command);
// 2. 加载"帮手"
// 这一步非常关键!系统启动时,必须先把写好的 C 语言库(dll文件)加载进来
static {
// 这里加载的是一个叫 "PrinterLib.dll" 的文件
// 就像你要用某个功能,得先插上对应的 U 盘或驱动
System.loadLibrary("PrinterLib");
}
public static void main(String[] args) {
PrinterController pc = new PrinterController();
// 这是一个简单的打印指令(比如让打印机走纸)
// 不同的打印机有专门的指令集,比如 TSC 用的是 TSPL 指令
String cmd = "SIZE 40 mm,30 mm\nGAP 5 mm,0 mm\nPRINT 1,1\n";
// 调用!
pc.printLabel(cmd);
System.out.println("指令已发送!");
}
}
二. PC 计数器:线程的"书签"
1.什么是PC计数器?
全称: 程序计数器 (Program Counter Register)
2.程序计数器的作用
通俗理解:
想象你在读一本书(执行代码)。如果你被叫去接个电话(CPU 时间片轮转,线程切换),你需要在这个页面夹一个书签,这样回来时才知道刚才读到哪一行。
PC 计数器就是这个**"书签"**。
- 它是线程私有的:每个人(每个线程)读自己的书,互不干扰,每个人都有自己的书签。
- 它记录的是下一条指令的地址:CPU 执行完这一行,就看 PC 计数器,去执行下一行。
特殊情况:
- 执行 Java 代码时:PC 计数器里记着字节码指令的地址(比如第 5 行代码对应的机器指令在哪)。
- 执行 Native 代码时 :PC 计数器的值是**空(Undefined)**的。因为这时候代码跑在 Java 虚拟机之外(C/C++ 世界),JVM 的"书签"管不着那里。
3.为什么它不会内存溢出(OOM)?
因为程序计数器本身非常小,只存一个地址数字,而且生命周期随线程结束就销毁,所以它是 JVM 规范里唯一一个不会发生 OutOfMemoryError(内存溢出) 的区域。
三.方法区
方法区专门存放类的"骨架" (类结构信息、静态变量、常量、字节码),绝对不存 具体的**"血肉"** (也就是
new出来的对象实例及其非静态属性,那些都在堆里)。
说白了:
- 方法区用来存模板性质的东西,比如类、静态变量、常量等等
- 堆用来存一些具体的东西,比如对象实例的属性等等
以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~