jvm 类的加载机制与原理
jvm(java virtual machine)可以被拆分为好几个部分,最开始的类加载器,执行引擎,本地接口、运行时数据区域。本章节主要针对类的加载机制进行说明
目前基本都知道,类在被运行时,需要经过堆类的加载,链接(验证、准备、解析)和初始化的阶段以及后面的回收阶段。
那么类是怎么被加载的呢?
类加载器的作用是将所需的类加载到内存中供应用程序使用。而加载器加载类是有原则遵循的。其遵守三个原则,委托机制、可见性、单一性
委托机制:加载类在加载class文件时,会优先交由父类去加载,如果父类找不到或者无法加载这个类,就会由其本身去加载
可见性:子加载类可以向上去找父加载类加载的类,而父加载类无法找到子加载类加载的类。
单一性:在一个应用中一个类只能被加载一次。
jvm的加载类分为四种:
根加载器(BootStrap classLoader):主要加载jre中的rt.jar中的class文件
扩展类加载器(Ext classLoader):主要用于加载jre中ext.jar中的class文件
系统类加载器(System classLoader):主要用于加载classpath下的class文件,开发的功能类
自定义类加载器(Custom classLoader): 有开发者有特殊需求,可自定义开发加载类,去加载特定的类
类的加载方式
隐式加载:一般在写代码用new 或者调用静态字段方法时,就是隐式加载了
显示加载:通过调用Class.forName()或者ClassLoader.loadClass()等方法
类加载器之间的关系与加载过程:
每个类加载器都有一个父类加载器(根加载器除外),关系为:自定义->系统->扩展类(父类加载器为null表示父类加载器为根加载器)->根。
这里的父类不是继承关系,而是引用关系,每个子加载类都有指向父类的一个引用。
类在系统的中由类加载器+类的全限定名称组成唯一的标识,不同加载器加载同一个类,是不相等的,
加载过程:首先某个类在加载时,会先让一个加载器去检查是否被当前加载器加载(loadClass()方法),如果已被加载则返回;未被加载,如果有父加载类,则让父加载器加载,如果没有父加载器,则让根加 载器加载。如果都没有找到,则让自身去加载(findClass()方法)。这就是上面的委托机制(双亲委派机制)。
参考链接:(20条消息) java 类加载器 双亲委派 根加载器、扩展类加载器、系统类加载器_wangjun5159的专栏-CSDN博客
(20条消息) 【JVM】JVM加载class文件的原理机制_renjingjingya0429的博客-CSDN博客_jvm加载class文件的原理机制
浙公网安备 33010602011771号