Java虚拟机原理图解之类加载器机制和类加载过程
1,Java语言跨平台是因为可以在大部分的操作平台中运行,因为它的运行环境是在Java虚拟机中的。Java虚拟机对各个平台来说就是各个平台的一个可执行程序
2,具体运行步骤
2.1根据jvm内存配置要求,为jvm申请特定大小的内存空间
2.2创建一个引导类加载器实例,初步加载系统类到内存方法区域
2.3创建JVM启动器实例Launcher(单例模式),并且获得类加载器ClassLoader。launcher内部有两个类加载器,
双亲委派模型:子类加载器只能判断某个类是否被引导类加载器加载过,不能委托它加载某个类
a,委托父类加载器帮忙加载
b,父类加载器加载不了,查询引导类加载器有没有加载过
c,没有加载过,当前类加载器自己加载该类
d,加载成功返回对应的对象,加载失败,抛出异常,类找不到
4,使用类加载器加载主类,首先查看主类的定义,根据主类定义,先去将主类内部声明的类成功加载到内存中,最后才加载主类
5,使用Main类的main方法作为程序入口的运行程序
6,方法执行完毕,jvm销毁,释放内存
三,类加载器
指的是可以加载类的工具。JVM自身定义了三个类加载器:
引导类加载器(Bootstrap Class Loader)、
使用C++语言实现的,不可以被Java代码访问到,我们可以插叙某个类是否被其加载过
拓展类加载器(Extension Class Loader )、
是整个jvm加载器的Java代码可以访问到的类加载器的最顶端,是超级父加载器,它没有父类加载器
应用加载器(Application Class Loader)
加载用户代码,
四,双亲委派模型的逻辑和底层代码
jdk自身默认的加载类的行为,我们可以通过继承复写该方法来改变行为
五,类加载器和Class对象的关系
6,线程上下文加载器
可以为当前的线程指定类加载器,这样就绕过双亲委派模型,实现特定的加载需求