JVM疑惑:Java类加载机制详解
Java虚拟机(JVM)的类加载机制是Java运行时环境的一个核心特性,它负责将.class文件加载到JVM中,并且为这些类创建对应的Java类型。类加载机制主要分为以下几个阶段:
- 加载(Loading):
-这是类加载过程的第一个阶段。在这个阶段,JVM会通过一个类的全限定名来获取定义此类的二进制字节流。
-这个字节流可以来自一个.class文件,也可以来自JAR包,或者通过网络下载,甚至是运行时计算生成。
- 加载完成后,JVM会使用这个字节流来创建一个
java.lang.Class
对象,这个对象代表了这个类在JVM中的一个类定义。
验证(Verification):
-验证阶段确保加载的类信息符合JVM规范,没有安全问题。
-包括文件格式验证、元数据验证、字节码验证和符号引用验证。准备(Preparation):
- 在这个阶段,JVM会为类变量(static变量)分配内存,并设置默认初始值。
-这些变量的内存分配在Java堆的方法区(Java8及以前)或元空间(Java8及以后)。
解析(Resolution):
-这个阶段将符号引用转换为直接引用。
-符号引用就是通过字符串描述的引用,而直接引用则是指向目标的指针、相对偏移量或一个间接定位到目标的句柄。初始化(Initialization):
- 在这个阶段,JVM会执行类构造器
<clinit>()
方法,该方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。 - 初始化阶段是类加载过程的最后一步,到此阶段,一个类才真正成为了JVM中的一部分。
类加载器层次结构:
- 启动类加载器(Bootstrap ClassLoader):用C++实现,负责加载JAVA_HOME/jre/lib目录中的核心类库,或者-Xbootclasspath参数指定的路径中的类。
- 扩展类加载器(Extension ClassLoader):由Java语言实现,继承自ClassLoader类,负责加载JAVA_HOME/jre/lib/ext目录或者由系统属性java.ext.dirs指定位置中的类库。
- 应用程序类加载器(Application ClassLoader):也称为系统类加载器,由Java语言实现,继承自ClassLoader类,负责加载环境变量classpath或系统属性java.class.path指定路径下的类库。
双亲委派模型(Parent Delegation Model):
- 当一个类加载器尝试加载某个类时,除非显式使用自定义类加载器,否则会先委托其父类加载器进行加载。
-这个模型确保了Java核心库的类型安全,防止核心库被随意篡改。
以上就是Java类加载机制的一个基本概述。理解这个机制对于深入掌握Java编程和性能调优非常重要。
还没有评论,来说两句吧...