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.每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间
互不影响,也避免了不停切换线程从而导致中断等问题

方法区:

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从未止步..

谢谢你的打赏,我会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值