JVM之native关键字与PC寄存器

简介: JVM之native关键字与PC寄存器

native关键字:

native关键字主要用于修饰方法

被native关键字修饰的方法叫做本地方法,一个native方法就是一个Java调用非Java代码的接口,该方法的实现由非Java语言实现,而是使用C或C++等其他编程语言实现


native方法主要用于加载文件和动态链接库,由于Java语言无法访问操作系统底层信息(比如:底层硬件设备等),这时候就需要借助C语言来完成了,被native修饰的方法可以被C语言重写


在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的


本地方法和其它方法不一样,本地方法意味着和平台有关,因此使用了native的程序可移植性都不太高,另外native方法在JVM中运行时数据区也和其它方法不一样,它有专门的本地方法栈[如下图所示]。


它实现了jvm与本地方法的结合,如下图所示,jvm体系结构:

主要是因为JAVA无法对操作系统底层进行操作,但是可以通过JNI(java native interface)调用其他语言来实现底层的访问,JNI可拓展java的使用,融合不同的编程语言为java所使用.


那么为什么是java调用C/C++,而不是C/C++来调用java呢?


这是由于在java刚出生的那个年代,那时候的C/C++已经肆意横行,如果想立足,就必须调用C/C++的程序,而调用的这些非java代码,都将在jvm中的本地方法栈中进行被“登记”,在最终执行的时候,加载本地方法库中的方法通过jvm.


PC寄存器:

程序计数器:

每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中方法字节码(用来储存指向一条指令的地址,也是即将要执行的指令代码),由执行引擎读取下一条指令,它是一个非常小的内存空间,几乎可以忽略不计。

每一个栈帧就相当于存储了一个方法,栈帧中的每一个指令都有一个标识,这里PC寄存器就存储指令的地址,起标识作用,执行引擎就根据这个标识来读取到下一条指令。


PC寄存器是唯一 一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域

PC寄存器存储字节码指令地址的作用:


为了记录指令继续执行的地方,因为CPU需要不停的切换各个线程,JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码按指令

PC寄存器为什么是线程所私有的?

a.因为CPU需要不停的切换各个线程,为了能够准确地记录各个线程正在执行的当前字节
码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器,这样一来各个线程
之间便可以进行独立计算,从而不会出现相互干扰的情况
b.由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理
器或者多核处理器中的一个内核,只会执行某个线程中的一条指令,并不会同时执行
c.每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间
互不影响,也避免了不停切换线程从而导致中断等问题

方法区:

方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊 方法,如构造函数,接口代码也在此定义,所有定义的方法信息都保存在该区域,此区域属于共享区间。


静态变量,常量,类信息(构造方法,接口定义),运行时的常量池存在方法区,但是实际变量存在堆内存中,和方法区无关。

相关文章
|
4月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
46 0
|
4月前
|
存储 缓存 安全
Java面试题:介绍一下jvm中的内存模型?说明volatile关键字的作用,以及它如何保证可见性和有序性。
Java面试题:介绍一下jvm中的内存模型?说明volatile关键字的作用,以及它如何保证可见性和有序性。
36 0
|
4月前
|
算法 安全 Java
Java面试题:解释JVM中的堆内存分代收集策略,并讨论年轻代和老年代的特点,描述Java中的线程池,并解释线程池的优点,解释Java中的`volatile`关键字的作用和使用场景
Java面试题:解释JVM中的堆内存分代收集策略,并讨论年轻代和老年代的特点,描述Java中的线程池,并解释线程池的优点,解释Java中的`volatile`关键字的作用和使用场景
47 0
|
6月前
|
Cloud Native Java Docker
【Spring云原生】Spring官宣,干掉原生JVM,推出 Spring Native!整体提升性能!Native镜像技术在Spring中的应用
【Spring云原生】Spring官宣,干掉原生JVM,推出 Spring Native!整体提升性能!Native镜像技术在Spring中的应用
|
6月前
|
Java
Native Image部署和JVM部署的主要区别
Native Image部署和JVM部署的主要区别
|
消息中间件 JavaScript 小程序
巴拿马项目:打通 JVM 与 Native 代码
巴拿马项目:打通 JVM 与 Native 代码
|
Java API C语言
Panama jvm和Native的桥梁
Panama,是新的外部函数和内存 API,它简化了 Java 和本机代码之间的互操作性。
302 0
|
Java 程序员 API
JVM系列(五):native关键字用法介绍
native关键字修饰的Java方法是一个原生态方法,方法对应的实现Java作用范围达不到,而是在用其他编程语言(如C和C++)文件中实现。Java语言本身不能直接对操作系统底层进行访问和操作,但可以通过JNI接口调用其他编程语言来实现对操作系统底层的访问。
JVM系列(五):native关键字用法介绍
|
存储 Java
JVM 从入门到精通(五)JVM运行时数据区——程序计数器(PC寄存器)
JVM 从入门到精通(五)JVM运行时数据区——程序计数器(PC寄存器)
153 0
JVM 从入门到精通(五)JVM运行时数据区——程序计数器(PC寄存器)
|
1月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
37 4