jvm关于类的加载

  • 1、类的加载过程
  • 加载
  • 链接
  • 验证
  • 准备
  • 解析
  • 初始化
  • 2、类加载器
  • 3、类的加载机制-双亲委派
  • 4、沙箱安全机制


java对同名类的加载顺序 jvm加载同名类_java对同名类的加载顺序


java对同名类的加载顺序 jvm加载同名类_java对同名类的加载顺序_02

1、类的加载过程

加载

java对同名类的加载顺序 jvm加载同名类_加载_03

链接

将Java类的二进制代码合并到JVM的运行状态之中。

验证

java对同名类的加载顺序 jvm加载同名类_类加载器_04

准备

java对同名类的加载顺序 jvm加载同名类_Java_05

解析

java对同名类的加载顺序 jvm加载同名类_加载_06

初始化

java对同名类的加载顺序 jvm加载同名类_加载_07

2、类加载器

类加载器负责加载所有的类,其为所有被载入内存中的类生成一个java.lang.Class实例对象。一旦一个类被加载如JVM中,同一个类就不会被再次载入了。正如一个对象有一个唯一的标识一样,一个载入JVM的类也有一个唯一的标识。在Java中,一个类用其全限定类名(包括包名和类名)作为标识;但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。例如,如果在pg的包中有一个名为Person的类,被类加载器ClassLoader的实例kl负责加载,则该Person类对应的Class对象在JVM中表示为(Person.pg.kl)。这意味着两个类加载器加载的同名类:(Person.pg.kl)和(Person.pg.kl2)是不同的、它们所加载的类也是完全不同、互不兼容的。

java对同名类的加载顺序 jvm加载同名类_加载_08

  • 启动类加载器(bootstrap class loader)
    它用来加载 Java 的核心类,是用原生代码来实现的,并不继承自java.lang.ClassLoader(负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作
  • 扩展类加载器(extensions class loader)
    它负责加载JRE的扩展目录,lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。由Java语言实现,父类加载器为null
  • 系统类加载器(system class loader)
    被称为系统(也称为应用)类加载器,它负责在JVM启动时加载来自Java命令的-classpath选项、java.class.path系统属性,或者CLASSPATH换将变量所指定的JAR包和类路径。程序可以通过ClassLoader的静态方法getSystemClassLoader()来获取系统类加载器。如果没有特别指定,则用户自定义的类加载器都以此类加载器作为父加载器。由Java语言实现,父类加载器为ExtClassLoader

3、类的加载机制-双亲委派

java对同名类的加载顺序 jvm加载同名类_Java_09


java对同名类的加载顺序 jvm加载同名类_类加载器_10

4、沙箱安全机制

java对同名类的加载顺序 jvm加载同名类_java对同名类的加载顺序_11