操作系统——类的加载过程

目录

一、类加载的过程

1、加载

2、连接

(1)、验证

(2)、准备

(3)、解析

3、初始化

二、类加载的触发

三、双亲委派模型

1、定义

2、过程

3、优点

(1)、避免重复加载类

(2)、保证安全性


一、类加载的过程

程序想要运行就需要把依赖的“指令和数据”加载到内存中,而类加载就是把 .class文件加载到内存中得到类对象的过程。

1、加载

加载阶段是整个“类加载”过程中的第一个阶段,它和类加载不同,是用来找到 .class文件,并且读取文件内容。

加载阶段Java虚拟机需要完成以下过程:

  • 通过一个类的全限定名来获取定义此类的二进制字节流
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

2、连接

(1)、验证

验证阶段的目的是确保 .class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。

(2)、准备

准备阶段是正式为类中定义的变量(静态变量)分配内存空间并设置类变量初始值。未初始化的空间,内存空间中的数据全是0,类对象中的静态成员也是全0。

(3)、解析

解析阶段是Java虚拟机将常量池内的符号引用替换为直接引用的过程,也就是针对字符串常量进行初始化的过程。

字符串常量在 .class文件中就存在,它们只是知道彼此之间的相对位置(偏移量)而不知道自己在内存中的实际地址。

此时的字符串常量就是符号引用,真正加载到内存中就会把字符串常量填充到内存中的特定地址上。字符串常量之间的相对位置虽然是一样的,但这些字符串有自己真正的内存地址。此时的字符串就是直接引用即Java中的普通引用

3、初始化

初始化阶段就是执行类构造器方法的过程,是Java虚拟机真正开始执行类中编写的Java程序代码,将主导权移交给应用程序的阶段。

初始化阶段针对类对象直接进行初始化:初始化静态成员,执行静态代码块,加载父类。

二、类加载的触发

类加载整体是一个“懒加载”的策略(懒汉模式——非必要、不加载),而不是JVM一启动就把所有的 .class都加载的。

类加载是在以下的场景才进行触发:

  • 创建了这个类的实例
  • 使用了这个类的静态方法/静态属性
  • 使用子类会触发父类的加载

三、双亲委派模型

1、定义

双亲委派模型所做的工作就是在类加载的第一个步骤中找到 .class文件的过程。JVM中加载类需要用到一组特殊的模块——类加载器

在JVM中内置了三个类加载器:

  • BootStrap ClassLoader:负责加载Java标准库中的类
  • Extension ClassLoader:负责加载一些非标准的,但是Sun/Oracle扩展的库的类
  • Application ClassLoader:负责加载项目中自己写的类以及第三方中的类

2、过程

双亲委派模型是类加载机制中一个较为重要的机制,如果一个类加载器收到了类加载的请求,它不会自己先去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一层的类加载器都进行该操作,因此所有的加载请求最终都会传送到最顶层的启动类加载器中。只有当父加载器反馈自己没有找到所需的类时,子加载器才会尝试自己去完成加载。 

3、优点

(1)、避免重复加载类

当A类和B类都有一个父类C类时,当A类启动时就会将C类加载,而在B类进行加载时就不需要在重复加载C类。

(2)、保证安全性

使用双亲委派模型可以保证Java的核心API不被篡改。

如果没有使用双亲委派模型,而是每个类加载器加载自己的就会出现一些问题。当我们编写一个称为java.lang.Object类时,程序运行系统就会出现多个不同的Object类,而有些Object类又是用户自己提供的因此安全性就不能得到保证。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自己动手写操作系统在详细分析操作系统原理的基础上,用丰富的实例代码,一步一步地指导读者用C语言和汇编语言编写出一个具备操作系统基本功能的操作系统框架。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。全书共分7章。 第1章 马上动手写一个最小的“操作系统”1 1.1 准备工作1 1.2 10分钟完成的操作系统1 1.3 Boot Sector3 1.4 代码解释3 1.5 水面下的冰山5 1.6 回顾6 第2章 搭建你的工作环境7 2.1 虚拟计算机(Virtual PC)7 2.1.1 Virtual PC初体验8 2.1.2 创建你的第一个Virtual PC9 2.1.3 虚拟软盘研究12 2.1.4 虚拟软盘实战14 2.2 编译器(NASM & GCC)18 2.3 安装虚拟Linux19 2.4 在虚拟Linux上访问Windows文件夹26 2.5 安装虚拟PCDOS26 2.6 其他要素29 2.7 Bochs29 2.7.1 Bochs vs. Virtual PC vs. VMware30 2.7.2 Bochs的使用方法31 2.7.3 用Bochs进行调试33 2.7.4 在Linux上开发34 2.8 总结与回顾36 第3章 保护模式(Protect Mode)37 3.1 认识保护模式37 3.1.1 GDT(Global Des criptor Table) 42 3.1.2 实模式到保护模式,不一般的jmp45 3.1.3 描述符属性47 3.2 保护模式进阶50 3.2.1 海阔凭鱼跃50 3.2.2 LDT(Local Des criptor Table)58 3.2.3 特权级62 3.3 页式存储82 3.3.1 分页机制概述83 3.3.2 编写代码启动分页机制84 3.3.3 PDE和PTE85 3.3.4 cr388 3.3.5 回头看代码88 3.3.6 克勤克俭用内存90 3.3.7 进一步体会分页机制100 3.4 中断和异常107 3.4.1 中断和异常机制109 3.4.2 外部中断111 3.4.3 编程操作8259A113 3.4.4 建立IDT116 3.4.5 实现一个中断117 3.4.6 时钟中断试验119 3.4.7 几点额外说明121 3.5 保护模式下的I/O122 3.5.1 IOPL122 3.5.2 I/O许可位图(I/O Permission Bitmap)123 3.6 保护模式小结123 第4章 让操作系统走进保护模式125 4.1 突破512字节的限制125 4.1.1 FAT12126 4.1.2 DOS可以识别的引导盘131 4.1.3 一个最简单的Loader132 4.1.4 Loader入内存133 4.1.5 向Loader交出控制权142 4.1.6 整理boot.asm142 4.2 保护模式下的“操作系统”144 第5章 内核雏形146 5.1 用NASM在Linux下写Hello World146 5.2 再进一步,汇编和C同步使用148 5.3 ELF(Executable and Linkable Format)150 5.4 从Loader到内核155 5.4.1 用LoaderELF155 5.4.2 跳入保护模式161 5.4.3 重新放置内核170 5.4.4 向内核交出控制权175 5.4.5 操作系统的调试方法176 5.5 扩充内核184 5.5.1 切换堆栈和GDT184 5.5.2 整理我们的文件夹191 5.5.3 Makefile191 5.5.4 添中断处理200 5.5.5 两点说明218 5.6 小结219 第6章 进程221 6.1 迟到的进程221 6.2 概述222 6.2.1 进程介绍222 6.2.2 未雨绸缪——形成进程的必要考虑222 6.2.3 参考的代码224 6.3 最简单的进程224 6.3.1 简单进程的关键技术预测225 6.3.2 第一步——ring0→ring1227 6.3.3 第二步——丰富中断处理程序243 6.3.4 进程体设计技巧254 6.4 多进程256 6.4.1 添一个进程体256 6.4.2 相关的变量和宏257 6.4.3 进程表初始化代码扩充258 6.4.4 LDT260 6.4.5 修改中断处理程序261 6.4.6 添一个任务的步骤总结263 6.4.7 号外:Minix的中断处理265 6.4.8 代码回顾与整理269 6.5 系统调用280 6.5.1 实现一个简单的系统调用280 6.5.2 get_ticks的应用286 6.6 进程调度292 6.6.1 避免对称——进程的节奏感292 6.6.2 优先级调度总结300 第7章 输入/输出系统302 7.1 键盘302 7.1.1 从中断开始——键盘初体验302 7.1.2 AT、PS/2键盘304 7.1.3 键盘敲击的过程304 7.1.4 解析扫描码309 7.2 显示器325 7.2.1 初识TTY325 7.2.2 基本概念326 7.2.3 寄存器328 7.3 TTY任务332 7.3.1 TTY任务框架的搭建334 7.3.2 多控制台340 7.3.3 完善键盘处理346 7.3.4 TTY任务总结354 7.4 区分任务和用户进程354 7.5 printf357 7.5.1 为进程指定TTY357 7.5.2 printf()的实现358 7.5.3 系统调用write()361 7.5.4 使用printf()363 后记366 参考文献369 附录书中的章节和代码对照表370

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值