说说类加载与卸载?
1 个回答
看山,看水,看众生,也看自己。南宫博#### 加载过程 类的加载过程主要包括五个阶段:加载、验证、准备、解析和初始化。其中,验证、准备、解析合称为链接。 1. **加载** - 通过类的完全限定名查找此类的字节码文件。 - 利用字节码文件创建 Class 对象。 2. **验证** - 确保 Class 文件符合当前虚拟机的要求,不会危害到虚拟机自身安全。 3. **准备** - 为 static 修饰的类变量分配内存,并设置初始值(0 或 null),不包含 final 修饰的静态变量,因为 final 变量在编译时分配。 4. **解析** - 将常量池中的符号引用替换为直接引用。直接引用可以是指向目标的指针或相对偏移量等。 5. **初始化** - 主要完成静态块执行以及静态变量的赋值。 - 先初始化父类,再初始化当前类。 - 只有在类被主动使用时才会初始化。 ##### 触发条件 - 创建类的实例时。 - 访问类的静态方法或静态变量时。 - 使用 `Class.forName` 反射类时。 - 某个子类初始化时。 #### 类的卸载 - Java 自带的加载器加载的类在虚拟机的生命周期中不会被卸载。 - 只有用户自定义的加载器加载的类才可以被卸载。 ### 加载机制 - 双亲委派模式 #### 双亲委派模式 - **定义**:加载器在加载类时先把请求委托给父类加载器执行,直到顶层的启动类加载器。如果父类加载器能够完成加载则成功返回,否则子类加载器才自己尝试加载。 - **优点**: - 避免类的重复加载。 - 保证 Java 核心类库的安全性。 #### 示例图解 ```plaintext ┌───────────────┐ │ Bootstrap │ │ ClassLoader │ └───────────────┘ ↑ ┌───────────────┐ │ Extension │ │ ClassLoader │ └───────────────┘ ↑ ┌───────────────┐ │ Application │ │ ClassLoader │ └───────────────┘ ↑ ┌───────────────┐ │ Custom │ │ ClassLoader │ └───────────────┘ ``` - **Bootstrap ClassLoader**:负责加载核心类库,如 `rt.jar`。 - **Extension ClassLoader**:负责加载扩展类库,如 `ext` 目录中的类库。 - **Application ClassLoader**:负责加载应用程序的类路径中的类。 - **Custom ClassLoader**:用户自定义的类加载器。 通过这种模式,可以确保 Java 核心类库不会被用户自定义的类加载器替换,从而保证系统的安全和稳定。发布于 2024-07-07 21:01 •IP属地 青海举报评论收藏
公众号进入网站体验更佳

