- .java文件被javac.exe编译为.class文件
- 通过类加载器加载.class 文件
- 验证是否符合jvm编译规则,一般用javac.exe编译的是不会有问题的,但是不排除有人用其他方法生成.class;
- 分配空间。后面会说到这里
- java.exe执行
-》2:类加载是双亲委托机制;
当本地类加载器加载一个class时,它首先不会自己去尝试加载这个类,
而是把类加载请求委派给父类加载器扩展级类加载器去完成。
当扩展级类加载器加载一个class时,它首先也不会自己去
尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。
如果启动级类加载器(BootStrapClassLoader)加载失败,会使用扩展级类加载器来尝试加载;
若扩展级类加载器也加载失败,则会使用本地类加载器来加载,
如果本地类加载器也加载失败,则会报出异常ClassNotFoundException。
-》4:分配空间 主要需要关心堆区,栈区,方法区,其实方法区也是堆区的一部分,只不过平时都分开描述
加载时,在方法区里,加载代码块-静态变量-静态方法-字符串常量
执行时,找程序执行入口main:然后会在栈区为它分配一个栈帧,里面存放main方法的局部变量;栈是每个线程独有的,不可共享
如果遇到新建对象操作,即new,就会在堆区中给它分配一个空间,存放对象的属性,变量,方法;(如果对象中有字符串,就会有从该字符串到方法区字符串常量的连接。)然后堆区中对象建立完毕会有一个内存地址给请求新建对象。这样在执行过程中就会通过该地址来访问堆区的对象。