Native关键字、程序计数器、方法区

目录

一.什么是Native关键字?

1.名字的含义

2.JNI的含义

3.JNI在JVM的位置

4.JNI(或者叫native关键字)的作用

5.代码演示

[二. PC 计数器:线程的"书签"](#二. PC 计数器:线程的“书签”)

1.什么是PC计数器?

2.程序计数器的作用

3.为什么它不会内存溢出(OOM)?

三.方法区


一.什么是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 出来的对象实例及其非静态属性,那些都在堆里)。


说白了:

  • 方法区用来存模板性质的东西,比如类、静态变量、常量等等
  • 堆用来存一些具体的东西,比如对象实例的属性等等

以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~

相关推荐
小辉同志3 天前
215. 数组中的第K个最大元素
数据结构·算法·leetcode··快速选择
YuanDaima204810 天前
堆(优先队列)基础原理与题目说明
linux·运维·服务器·人工智能·python··代码
im_AMBER10 天前
Leetcode 158 数组中的第K个最大元素 | 查找和最小的 K 对数字
javascript·数据结构·算法·leetcode·
汀、人工智能15 天前
[特殊字符] 第100课:任务调度器
数据结构·算法·数据库架构·贪心··任务调度器
汀、人工智能17 天前
[特殊字符] 第95课:冗余连接
数据结构·算法·链表·数据库架构··冗余连接
汀、人工智能17 天前
[特殊字符] 第97课:前K个高频元素
数据结构·算法·数据库架构··数据流·前k个高频元素
汀、人工智能17 天前
[特殊字符] 第98课:数据流中位数
数据结构·算法·数据库架构··数据流·数据流中位数
汀、人工智能19 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
汀、人工智能20 天前
[特殊字符] 第28课:相交链表
数据结构·算法·链表·数据库架构··相交链表