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.每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间 互不影响,也避免了不停切换线程从而导致中断等问题
方法区:
方法区是被所有线程共享
,所有字段和方法字节码,以及一些特殊 方法,如构造函数,接口代码也在此定义,所有定义的方法信息都保存在该区域,此区域属于共享区间。
静态变量,常量,类信息(构造方法,接口定义),运行时的常量池存在方法区,但是实际变量存在堆内存中,和方法区无关。