类的加载过程:
加载 链接:( 验证 准备 解析) 初始化 使用 卸载
加载: classpath jar包 网络,磁盘位置。类的class 二进制字节流都进来。 在内存中生成 java.lang.Class 对象放进元空间。 此阶段可以干预,自定义类的加载器实现类的加载。
验证 : 验证Class文件的字节流包含的信息符合《java虚拟机规范》的全部约束要求。保证虚拟机的安全。 class文件的二进制 cafe babe 魔法头
准备: 类变量赋值 int 为 0 long 0L boolean 为false 引用类型是null。 常量赋正式值。
解析: 把符号引用翻译为直接引用。
初始化: new 类的时候, 访问类的静态属性。 修改静态属性。 调用静态方法 。反射调用。 初始化类,父类也会被初始化。
使用: 使用这个类。
卸载: GC。 1。该类的所有实例都被gc 。jvm不存在该类的实例 2.加载类的ClassLoader 被gc。 3,没有引用。 (一般不卸载类。)
一个类被初始化的过程:
使用时候: 先加载。 赋值静态变量, 静态代码快。 new对象时候,按照代码顺被,初始化代码块,构造器。
继承时父子类的初始化顺序:
先加载父类。在加载子类。
类的顺序,按照类的加载顺序执行。
父类:静态变量。静态初始化快。子类:静态变量。静态初始化快。new时:父类变量,初始化快,构造器。子类变量,初始化快,构造器
什么是类加载器:
在类的加载阶段,通过一个类的全限定名来获取描述该类的二进制字节流的这个动作的代码,被称为类加载器。这个动作是可以自定义实现的。
JVM有那些类加载器:
虚拟机角度看。分为 2种,启动类加载器(Bootstrap ClassLoader),其他类加载器,继承抽象类java.lang.ClassLoader。
站在JDK角度看, 1.2开始保持3层类加载器架构。
JVM种不同的类加载器 加载那些文件?
1.启动类加载器(Bootstrap Classloader):C++<JAVA_HOME>\jre\lib\rt.jar,resources.jar.charsets.jar 或 -Xbootclasspath参数指定的路径种存放的类库。
2.扩展类加载器(Extension ClassLoader):JAVA语言实现的
sun.misc.Launcher$ExtClassLoader
jre\lib\ext.
被java.ext.dirs系统变量指定的路径中所有的类库。
3.应用程序类加载器。Application ClassLoader:系统的类加载器:JAVA语言实现的
sun.misc.Launcher$AppClassLoader