JVM之类加载子系统

Java 虚拟机

1. JVM概述

如图所示,JVM被分为几大功能模块:
  • 类加载子系统
  • 运行时数据区(我们重点关注该模块的堆、栈、方法区)
  • 执行引擎(一般都是JIT编译器和解释器共存)

2. 类的加载(掌握)

2.1 简述类的加载过程

  • 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载类的链接类的初始化这三个步骤类对类进行初始化。这是一个连贯的步骤,没有意外情况的话,会一次性执行完毕,所以有时也把这三个步骤统称为类的加载或者初始化。

2.2 类的加载

  • 类的加载指的是将类的.class文件中的二进制数据读取到内存中,存放在运行时数据区的方法区中,并创建一个大的Java.lang.Class对象,用来封装方法区的数据结构。

2.3 类的链接

  • 1.验证:确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载的类的正确性。
  • 2.准备:为类变量分配内存地址并且设置该类的默认初始化值,不会为实例变量分配初始化
  • 3.解析:将常量池中的符号引用转换为直接引用的过程

2.4 类的初始化

  • 类变量赋予正确的初始化值
  • 初始化阶段就是执行类构造器方法()的过程。
  • 不同于类的构造器,只要有静态变量或者静态代码块,那么在字节码中就存在这个方法
  • 若该类有父类,那么在执行子类的之前会保证父类的已经执行完毕。

3. 类加载器

JVM支持两种类型的类加载器,分别是引导类加载器(Bootstrap ClassLoader)和自定义类加载器,常见的类加载器只有三个,分别是:Bootstrap Class Loader、Extension Class Loader以及System Class Loader。

除了Bootstrap Class Loader以为,其他的类加载器都可以通过getClassLoader()方法进行获取,因为Bootstrap Class Loader使用c/c++语言编写的,所以无法获取

3.1 启动类加载器

  • 这个类加载器使用c/c++语言实现,嵌套在JVM内部
  • 它用来加载Java的核心类库(JAVA_HOME/jre/lib/rt.jar、resource.jar或sum.boot.class.path路径下的内容),用于提供JVM自身需要的类
  • 并不集成java.lang.ClassLoader,没有父加载器
  • 负责加载扩展类加载器和应用程序类加载器,并制定为他们的父类加载器

3.2 扩展类加载器

  • Java语言编写,由sum.music.Launcher$ExtClassLoader实现
  • 派生于ClassLoader类
  • 父加载器为启动类加载器

3.3 应用程序类加载器

  • Java语言编写,由sum.music.Launcher$AppClassLoader实现
  • 派生于ClassLoader类
  • 父类加载器为扩展类加载器
  • 该类加载器为程序中默认的类加载器,一般来说,Java应用的类都是由它来完成加载

3.4 双亲委派机制

  • 工作原理:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行加载;如果父类加载器还存在父类加载器,则进一步向上委托,依次递归,请求最终会到达顶层的启动类加载器;如果父类加载器可以完成类加载任务,就成功返回。否则,子加载器才会尝试自己去加载。
向上委托
向上委托
自定义类加载器
系统类加载器
自定义类加载器
拓展类加载器
引导类加载器
  • 优势:
    • 避免类的重复加载
    • 保护程序安全,防止核心API被随意串改
      • 自定义类:java.lang.String
      • 自定义类:java.lang.PlutoStart

虽然自定义类String类,但是在加载自定义的String类时,会率先使用引导类加载器加载,而引导类加载器会率先加载JDK自带的文件,这样可以做到对Java核心源代码的保护,这就是 沙 箱 安 全 机 制 \color{red}{沙箱安全机制}

3.5 如何判断两个Class对象是否相同

  • 在JVM中表示两个class对象是否为同一个类必须满足两个条件:
    • 类的完整类名必须一致,包括包名
    • 加载这个类的ClassLoader必须相同
  • JVM必须知道一个类是由启动类加载器加载还是用户类加载器加载,如果由用户类加载器加载,那么JVM会将这个类加载器的一个引用作为类型信息的一部分保存在方法区中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值