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,线程上下文加载器

 

 可以为当前的线程指定类加载器,这样就绕过双亲委派模型,实现特定的加载需求

 

posted @ 2020-10-19 11:54  笨笨走了  阅读(120)  评论(0编辑  收藏  举报