黑马JVM总结(二十三)

(1)字节码指令-init

方法体内有一些字节,对应着将来要由java虚拟机执行方法内的代码,构造方法里5个字节代码,main方法里有9个字节的代码

java虚拟机呢内部有一个解释器,这个解释器呢可以识别平台无关的字节码指令,把它们最终解释为机器码,然后执行 

可以查看文档:

(2)字节码指令-main

(3)javap

(4)图解运行流程-准备

这么一段java代码别执行时,会由java虚拟机的类加载器刚main方法所在的类进行一个类加载的操作,来加载就是把这些class字节的数据读取到内存里来 ,常量池的数据回放入到一个运行时常量池,JVM的内存分成了堆、栈、方法区,这个运行时常量池属于方法区的一部分,将来把Class常量池中的数据存入到运行时常量池中,将来找一些方法引用,成员变量引用啊就去运行时常量池中找

 一些小的数字并不是存入到常量池中的,它是根据方法的字节码指令存在一起,一旦这个数的范围超过了整数的最大值,就会存储到常量池中,也就是在short这个范围内的数字是跟字节码存储一起的,Short.Max_value是36767

方法的哪些字节码会放入到方法区 

main方法准备运行了,在运行之前main这个主线程,启动之后呢会给这个main分配一个栈帧内存,一个绿色的代表局部变量表,蓝色的代表操作数栈,由下面这两项决定栈帧内存的大小

操作数栈:将来用来存储数据和字节码指令

main线程开始运行,把栈帧分配好,下一步由执行引擎去速去main方法中的一个个指令 

(5)图解运行流程-a赋值

bipush10和istore对应java源代码中的int a=10;

(6)图解运行流程-剩余代码

把运行时常量池中的数据加载到操作数栈

从栈定弹出数据存入2号插座

加下来执行 c=a+b的代码这个操作需要在操作数栈中完成,在局部变量是不能执行这个操作的,执行引擎呢会把a和b的变量进行一个读取:对应下面:

iload 1读取一曹伟

iload 2  读取2曹位

iadd:对应加法运算 ,执行引擎执行iadd,iadd会弹出操作数栈中的两个变量并且把结果存入操作数栈

 

把操作数栈中的结果取出来存入到局部变量表3号曹位 

 

去常量池占用找到一个成员变量的引用,找到out成员变量,这个成员变量呢存在堆内存中,找到之后呢并不是被这个对象放到操作数栈,它只是获取到这个对象的引用 ,把引用值存入操作数栈

打印的时候需要3曹位的值,进行加载

去常量池中找到执行的方法println方法这个方法执行的而过程中会找到定位在方法区的一个新的方法上这个新的方法呢,会给他分配一个新的栈帧,然后执行把会栈中的信息32768作为参数传到新的栈帧中,接收一个帧数参数

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值