博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM——main()方法的执行。
阅读量:4207 次
发布时间:2019-05-26

本文共 778 字,大约阅读时间需要 2 分钟。

例子:

public class Lava {	private int speed = 5;		void flow(){		System.out.println("flow");	}}
public class Volcano {	public static void main(String args[]){		Lava lava = new Lava();		lava.flow();	}}

运行:

通过javac编译java文件,生成class文件。通过java运行Volcano。

原理:

1。java命令告诉虚拟机Volcano这个名字。

2。虚拟机找到并读入Volcano.class。

3。从Volcano.class中提取类型信息放到方法区

4。通过执行保存在方法区的字节码,虚拟机开始执行main()方法,在执行时,它会一直指向Volcano的常量池的指针。

5。main()的第一条指令告知虚拟机为列在常量池第一项的类分配足够的内存。如下图:

6。常量池的指针第二项为Lava类的符号引用。如下图:

7。发现没有装载“Lava”类。查找“Lava.class”,读入方法区。

8。直接指向方法区Lava类数据的指针替换常量池第一项(常量池解析)。

9。通过8中的指针访问Lava类型信息,为Lava对象分配内存。

10。在堆上分配内存空间之后,变量speed初始化默认值0。

11。新生成的Lava对象引用压倒栈中。

12。main()方法第一条指令over。

13。调用flow()方法时。虚拟机都会在该线程的Java栈中压入一个新栈。

14。虚拟机开始执行flow方法的命令,如下图:

参考资料:

《深入Java虚拟机第二版》

thomesca(北蔡):http://blog.csdn.net/thomescai (转载请保留)

你可能感兴趣的文章
【HTML5/CSS/JS】<br>与<p>标签区别(二)
查看>>
【HTML5/CSS/JS】开发跨平台应用工具的选择(三)
查看>>
【心灵鸡汤】Give it five minutes不要让一个好主意随风而去
查看>>
【React Native】Invariant Violation: Application AwesomeProject has not been registered
查看>>
【ReactNative】真机上无法调试 could not connect to development server
查看>>
【XCode 4.6】常用快捷键 特别是格式化代码ctrl+i
查看>>
【iOS游戏开发】icon那点事 之 实际应用(二)
查看>>
【iOS游戏开发】icon那点事 之 图标设计(三)
查看>>
【IOS游戏开发】之测试发布(Distribution)
查看>>
【IOS游戏开发】之IPA破解原理
查看>>
【一天一道LeetCode】#45. Jump Game II
查看>>
【一天一道LeetCode】#46. Permutations
查看>>
【一天一道LeetCode】#47. Permutations II
查看>>
【一天一道LeetCode】#48. Rotate Image
查看>>
【一天一道LeetCode】#56. Merge Intervals
查看>>
【一天一道LeetCode】#57. Insert Interval
查看>>
【一天一道LeetCode】#58. Length of Last Word
查看>>
【一天一道LeetCode】#59. Spiral Matrix II
查看>>
【一天一道LeetCode】#30. Substring with Concatenation of All Words
查看>>
【一天一道LeetCode】#60. Permutation Sequence.
查看>>