前置:
JVM初认识参考地址
内容概要
jvm.dll就相当于java中大xxx.jar文件,里面有很多的库函数、代码的实现
C++语言调用虚拟机的启动程序Launcher
【jvm启动器的实例】,该类由引导类进行加载,用来创建其他类加载器。
通过这些加载器去真正调用loadclass
去加载类,加载完后jvm会执行类的main
()方法
loadclass的类加载过程有以下几步:
加载-----验证------准备------解析-----------------初始化----------【使用----------卸载】
在class字节码文件中输入javap -v R.class 将字节码文件生成可读文件
上面的结果是load A--------load B------------load test
new A();的时候,会先加载A类,所以输出load a;new A()会调用构造方法;所以会输出initial A
而B没有new 不会输出任何
类加载器
AppClassLoader调用最终父类ClassLoader 里面的loadClass方法再调用findLoadedClass方法去已经加载类的集合中找该类是否已经被加载,加载过的就直接返回,要是都没加载过,否则会逐级往上属性parent.loadClass去重复上个类加载器工作原理,直到parent属性值为空else中交给引导类加载器。调用本类的类加载器的findclass去完成加载
【上图】框中就是引导类加载器,用来去引导类加载器已经加载过的去找,或者去加载,如果能加载就返回,不能加载就跳出,给ext扩展类加载器去加载,扩展类加载器继承URLClassloader,就会调用父类URLClassloader的findClass【下图】找到类路径拿到相应类的文件,再调用defineClass进行加载,由于我们自己写的类在target文件中,肯定是加载不到的,又回到AppClassLoader,找到findClass方法 同样到父类的findClass方法就会拿到这个类中。
loadClass :实现双亲委派机制
findLoadedClass 底层是C++实现的