jvm - 体系结构 & 本地方法接口 & pc寄存器 & 方法区 &栈

 

线程是操作系统级别的,不是语言级别的。
因为Java语言中new Thread().start()中,其本质调用了一个native方法:start0();
native方法:调用的是和Java无关的底层的操作系统库或者C语言函数库。
本地方法接口(Native Interface)

 

由于栈中存放方法,所以栈分了两类:Java栈(又叫虚拟机栈)、本地方法栈(Native Method Stack)(里面存放native方法)
本地方法栈:
本地方法接口在本地方法栈中登记标记为native的方法,当执行引擎执行时,本地方法接口调用native方法库

 


程序计数器(Program Counter Register)(又叫PC寄存器)
用来存储指向下一条指令的地址,也即将要执行的指令代码,其本质就是一个指针,如果执行的是native方法,那这个指针是空的

属于灰色部分:即 线程私有(即每个线程对应一个PC寄存器)、内存占的特别少,几乎不存在垃圾回收

 


方法区:所有线程共享、有垃圾回收
方法区并不存放方法,而是存放类的模板(类的结构信息,以Class的形式存在,放在方法区中,由类加载器加载class得来)
方法区是一种规范,在不同虚拟机中实现是不一样的:

 


栈管运行
堆管存储

栈中主要存放方法(Java方法放进JVM中的虚拟机栈后,称为栈帧)(即一个方法对应一个栈帧)、基本变量、引用

栈中的方法又叫栈帧(Java方法放进JVM中的虚拟机栈后,称为栈帧)
所以栈中存放的是栈帧。
例如:在main方法里面调用m1()方法,则虚拟机栈如图所示:(m1方法执行完后,main方法才能执行完)

但其实,一般说栈帧里面存着两个东西:局部变量表+操作数栈
说完全点,是下面这些:

int i,j,k存在于局部变量表中,操作数栈中的结果赋值给局部变量表,++i、i++影响的是局部变量表中的数需不需要在放进操作数栈前先加1。
++i:修改局部变量表值直接加一,再放进操作数栈
i++:先把局部变量表中的值取出来放进操作数栈,再局部变量表直接加一

public static void main(String[] args) {
        int i = 1;
        i = i++;
        int j = i++;
        int k = i + ++i * i++;
        System.out.println("i=" + i);
        System.out.println("j=" + j);
        System.out.println("k=" + k);
}
//运行结果:i=4,j=1,k=11

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值