1.jvm启动时第一个调用的是哪个类、哪个方法?
比如
public class A{
public static void main(String[] args){
new A().method1();
}
public void method1(){
syso("method1 be call");
}
}
然后,我们在main方法了调用new A().method1(); 控制台就会输出 method1 be call 了。
这个过程中,我们都知道,首先是jvm读取A.class,然后用类加载器进行加载,然后用newInstance()获得A类的实例,然后去调用method1()方法,最终输出"method1 be call"
我想知道,这个第一步 ”jvm获取A.class“,jvm启动后,调用的第一个类是哪个类、哪个方法(很可能是native的),然后做了什么操作才知道去读取A.class ?
2.jvm的三个加载器,加载范围是在什么地方进行限定的?为什么要有三个加载器
jvm有三个类加载器,appClassLoader、extClassLoader、bootstrapClassLoader,分别对应加载java.class.path路径/jre的ext目录/jre的目录下的jar
这个范围的区分,是什么地方规定的?为什么要这么区分呢?
还要,我觉得其实只要两个类加载器就可以了啊,一个appClassLoader,负责加载程序员编写的类的加载,一个bootstrapClassLoader,负责加载jre目录下的所有的jar,
如果还要特殊要求的话,程序员自己继承classLoader写自己的类加载器不就好了,那extClassLoader存在是因为什么呢(jdk的编写者肯定比我聪明,这些我想到的他肯定也想到了)
哪位前辈对这两个问题有思考过,求解