JVM(二):Class加载机制

简介: JVM(二):Class加载机制

Class 类加载机制

类的生命周期

包括以下 7 个阶段:

  • 加载(Loading)
  • 验证(Verification)
  • 准备(Preparation)
  • 解析(Resolution)
  • 初始化(Initialization)
  • 使用(Using)
  • 卸载(Unloading)

类加载过程

加载

  • 通过全限定类名来获取定义此类的二进制字节流
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  • 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。
类加载器【ClassLoad】
  • Bootstrap : 加载 librt.jar 等核心类,由 C++ 编写【Java 识别不了,返回 null】
  • Extension : 加载扩展 jar
  • App : 自己定义的 ClassPath 指定内容
// sun.misc.Launcher$AppClassLoader@73d16e93
public class P {
  public static void main(String[] args) {
    System.out.println(P.class.getClassLoader());
  }
}
  • Custom ClassLoader : 自定义的 ClassLoader

类加载器的流程

  • 我们 .Class 文件去 Custom 缓存中寻找是否加载过该类,

Q:加载器之间不是继承关系,那么是怎么来下实现的?

A:通过引用的 Parent 来进行实现

双亲委派的原因

  • 出于安全性考虑【防止程序员自己构建 Java.lang.Class 对象】
  • 资源浪费问题【防止类重新进行加载】

双亲委派机制的打破

  • 重写 LoadClass,改变其 Parent 的引用
  • 何时打破过?
  1. JDK 1.2 之前,自定义 ClassLoader 都必须要重写 LoadClass()
  2. 热启动、热部署: 直接将 ClassLoad 全部干掉,重新进行加载 ClassLoad

验证

验证文件是否符合 JVM 规定,验证开头是否为 CAFEBABE

准备

给静态成员变量赋予默认值

解析

  • 将类、方法、符号引用解析成直接引用
  • 常量池中的各种符号引用解析成指针等内存地址的直接引用

初始化

  • 调用类初始化代码,给静态变量赋予初始值
  • 先进行赋予默认值(null / 0),再赋予初始值
//  输出的 T.count 的值
public static ClassLoading{
  public static void main(String[] args){
    System.out.println(T.count);
  }
}
class T{
  public static T t = new T();
  public static int count = 2;
  private T(){
    count++;
  }
}

总结

  • load - 默认值 - 初始化
  • new - 申请内存 - 默认值 - 初始化


相关文章
|
2月前
|
存储 缓存 Java
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
39 1
|
5天前
|
前端开发 Java 开发者
JVM类加载器的分类以及双亲委派机制
JVM类加载器的分类以及双亲委派机制
|
15天前
|
监控 Java 关系型数据库
JVM工作原理与实战(十三):打破双亲委派机制-线程上下文类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了打破双亲委派机制的方法、线程上下文类加载器等内容。
15 2
|
15天前
|
监控 安全 前端开发
JVM工作原理与实战(十二):打破双亲委派机制-自定义类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了打破双亲委派机制的方法、自定义类加载器等内容。
17 1
|
15天前
|
监控 前端开发 安全
JVM工作原理与实战(十一):双亲委派机制
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了双亲委派机制、父类加载器、双亲委派机制的主要作用、双亲委派机制常见问题等内容。
14 1
|
15天前
|
存储 监控 安全
JVM工作原理与实战(五):类的生命周期-加载阶段
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的加载阶段等内容。
25 5
|
2月前
|
存储 Java 索引
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透class字节码文件技术基底和实现原理(核心结构剖析)
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透class字节码文件技术基底和实现原理(核心结构剖析)
34 0
|
2月前
|
安全 前端开发 Java
【JVM】双亲委派机制详细解读(通俗易懂)
【JVM】双亲委派机制详细解读(通俗易懂)
122 0
|
3月前
|
安全 Java 程序员
深入理解jvm - 类加载过程
深入理解jvm - 类加载过程
50 0
|
4月前
|
缓存 安全 前端开发
JVM(类的加载与ClassLoader、双亲委派机制)
JVM(类的加载与ClassLoader、双亲委派机制)