类加载过程步骤:加载>链接(包含验证,准备,解析)>初始化>使用>卸载
- 加载(loading):通过类的全限定名(全限定名 = 包名+类型,eg:java.lang.String)获取此类的字节流(此字节流可以是通过读取.class文件,也可以通过网络io流,或者其他压缩包等途径获取),将流代表的静态存储结构(.class文件)转化为方法区(作为一个内存区域,类模板对象,jdk1.8以前永久代,1.8之后元空间)的运行时数据结构,在堆内存中生成一个代表该类的java.lang.class对象,作为方法区这个类的各种数据的访问入口
- 链接(linking)(包含验证(verification),准备(preparation),解析(resolution))
- 初始化(Initialization)初始化就是执行类构造器方法
的过程,此方法是javac编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并而成,构造器方法中指令按语句的源文件中出现的顺序执行(idea 插件jclasslib查看字节码),clinit方法是类变量方法变量赋值才会产生,而类的构造器则在虚拟机下面会产生init方法(只有类具有静态变量或者静态代码块才会在字节码中生成clinit方法),如果编译类具有父类,jvm会先保证父类的clinit方法执行完毕,再执行子类的clinit,虚拟机必须保证一个类clinit方法在多线程下被同步加锁 ,并且初始化是否需要执行也取决于类是否主动使用,主动使用就执行初始化过程,被动使用则不执行,可参考:类的主动使用被动使用 - 使用(Using) 开发过程中各种编码做的 *** 作,new 一个实例,实例.方法等 *** 作
- 卸载(Unloading) 在平常的日常开发过程中很难做到卸载,可参考:Java类的卸载机制
类加载器运用于类加载过程中的加载(loading)阶段
jvm支持的两种类加载器:
- 引导累加载器(Bootstrap ClassLoader)
- 自定义类加载器(User-Defined ClassLoader),jvm定义的自定义类加载器是所有派生与抽象类ClassLoader的类加载器都统称为自定义类加载器
我们常见的类加载器有三个:
类加载的双亲委派机制:如果一个类加载器收到类加载请求,不会直接加载,而是委托给父类加载器加载,一直递归往父类委托,直到顶层的引导类加载器,递归加载到该类则直接返回,如果递归过程中一直未加载到该类,子加载器才会自己加载
双亲委派机制
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)