| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 【JVM】--- 类加载 -> 正文阅读 |
|
[Java知识库]【JVM】--- 类加载 |
前言? ? ? ? ladies and gentleman , 你们好😊 ,我是羡羡 , 这节我们进入jvm的学习 , 我们知道 , jvm是java虚拟机, java代码的执行与 jvm 息息相关, 接下来我们来依次介绍 , 首先这节先来介绍 jvm 中的类加载部分 目录 1. jvm 的组成? jvm组成可分为这四个部分
那么一个程序在 jvm 中的运行过程是怎样的呢?? ? ? ? ?java代码首先被编译成字节码文件(Class文件),? 通过不同操作系统上的 jvm 来加载解释 , 这个过程首先需要类加载器加载class文件 , 然后进行字节码校验 , 校验结束通过后通过jvm解释器翻译成机器码交给操作系统执行
jvm整体结构如下图 ?可能说到这里 , 初学的同学会有点懵 , 不过不用担心, 上图中的各个组成部分后面都会一一解释 2. 类加载? ? ? ?通过上面 jvm的运行过程可知 , 类加载就是读取 class文件的过程 , 这期间需要用到类加载器 , 类加载器只负责加载 , 至于如何执行 , 则由执行引擎决定 类加载 又分为以下几个模块 ? ? ? 类加载器加载class文件到 jvm中 , 被称为DNA元数据模板 , jvm通过模板来创建实例 , 类加载器在此过程相当于担任了快递员的角色 那么类加载的过程是怎样的呢 ? 可以看到 , 分为三个过程 : 加载, 链接 ,初始化? 1. 加载??
?顾名思义 , 加载就是把类中的信息加载进 jvm 中 2.链接 ?链接又分为 3 个过程 : 验证, 准备 ,解析 (1) . 验证
? ? ? ? 验证文件格式是否一致: class 文件在文件开头有特定的文件标识(字节码文件都以 CA FE BA BE 标识开头);主,次版本号是否在当前 java 虚拟机接收范围内 ? ? ? ?元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合java 语言规范的要求,例如这个类是否有父类;是否继承浏览不允许被继承的类(final 修饰的类) 验证过程主要是看是否符合java语言的规范 (2) . 准备
此过程不包含用 final 修饰的 static 常量(静态常量),在编译时进行初始化.
(3) .解析
? ? ? 将符号引用替换成直接引用, 这句话怎么理解呢 ? 这里来举个例子
? ? ? ? 在 方法1 中调用 方法2 , 我们这样来写代码的时候, 这就只是符号引用 , 而当这段程序被加载进 jvm解析的时候 符号引用就会变成直接引用, 也就是指明此处真正的引用地址 3. 初始化 ?在谈类的初始化过程之前, 先来考虑 , 类什么时候会被初始化??
? ? ? ?初始化类的过程也是为类中成员赋值的过程 , 在链接过程中的准备过程中被static修饰的变量是赋了默认值(int型为0), 而在初始化过程中才会赋予我们赋的值 ? ? ? ?我们常说 , 用 static 修饰的变量, 方法 , 代码块是跟类直接打交道的 , 我们说加载类的时候, 使用static修饰的成员也会被加载 , 此过程也是在类的初始化中完成 那么在初始化过程中, 赋值顺序是怎样的呢?
下面代码 num 的值变化 3. 类加载器? ? ? ? 从开发人员的角度上来讲, 类加载器可分为3类 : 引导类加载器(启动类加载器), 扩展类加载器 , 应用程序类加载器 ?引导类加载器(启动类加载器)
? ? ? 引导类加载器作为顶级的类加载器, 非java语言实现 , 所以和java中其他类加载器也不存在继承关系等
应用程序类加载器
?
我们自己写的类是由应用程序类加载器加载的, 类加载器结构示例如下
?
另外还有一种叫做用户自定义类加载器 , 例如 tomcat 4. 双亲委派机制? ? ? ?什么是双亲委派机制呢??
.
? ? ? 就是说呢, 如果类加载器接收到了加载请求, 并不会去立即加载这个类, 而是把请求交给它的上一级加载器去加载 , 上一级没有则继续往上找 , 直到顶级的类加载器(引导类加载器)也无法加载时, 开始往下找 , 如果有一级加载成功则返回, 最终加载器都无法加载时, 就会抛出ClassNotFoundException异常 ? ? ? 那么为什么要这样去做呢? 试想, 我们自己创建一个java.lang.String类
建立一个测试类
? ? ? ??试想 , "自己的String" 这句话会被输出吗 ? 答案肯定是不会
5. 类的主动/被动使用? ? ? JVM 规定,每个类或者接口被首次主动使用时才对其进行初始化,有主动使用,自然就有被动使用.
除了上面的几种主动使用其余就是被动使用了
? ? ? 主动使用和被动使用的区别在于类是否会被初始化. 结语? ? ? ?到此关于 jvm 类加载这一章就说完了 , 感谢您的阅读 , 后续将会进行 jvm 中运行时数据区的讲解 , 感谢您的支持 ,谢谢😊 !!!
? ? ? ??
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 2:43:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |