(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作为参数传到新的栈帧中,接收一个帧数参数