java程序加载过程

来源:互联网 发布:js定义json数组并赋值 编辑:程序博客网 时间:2024/05/16 12:20

未完待续

注意:Android虚拟机和我们常见JVM虚拟机是不同的

加载过程

1当遇到Main方法的时候会自动压栈

2 .class字节码 文件首先被加载到方法区,占用一个空间,
在常量池,创建一个.class的符号变量.

3当调用方法的时候,会将方法压入栈中(),形成栈帧(栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息).

4 当再次调用方法时,会在方法区检查有无.class文件.若有,就,若无.

常量池分为:静态常量池和运行时常量池。
常量池的一篇好文章

所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。

而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。

在编译好java程序得到MainApp.class文件后,在命令行上敲java AppMain。系统就会启动一个jvm进程,jvm进程从classpath路径中找到一个名为AppMain.class的二进制文件,将MainApp的类信息加载到运行时数

据区的方法区内,这个过程叫做MainApp类的加载。
然后JVM找到AppMain的主函数入口,开始执行main函数。

http://allenhk.iteye.com/blog/1866288
main函数的第一条命令是Animal animal = new Animal(“Puppy”);就是让JVM创建一个Animal对象,但是这时候方法区中没有Animal类的信息,所以JVM马上加载Animal类,把Animal类的类型信息放到方法区中。

加载完Animal类之后,Java虚拟机做的第一件事情就是在堆区中为一个新的Animal实例分配内存, 然后调用构造函数初始化Animal实例,这个Animal实例持有着指向方法区的Animal类的类型信息(其中包含有方法表,java动态绑定的底层实现)的引用。

当使用animal.printName()的时候,JVM根据animal引用找到Animal对象,然后根据Animal对象持有的引用定位到方法区中Animal类的类型信息的方法表,获得printName()函数的字节码的地址。

开始运行printName()函数。

0 0
原创粉丝点击