| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> JVM类加载机制 -> 正文阅读 |
|
[JavaScript知识库]JVM类加载机制 |
目录 2.1 引导类加载器(Bootstrap ClassLoader) 2.2 扩展类加载器(Extension ClassLoader) 2.3 系统类加载器(Application ClassLoader) ????????当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。? ? 一、类加载过程
????????加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识(CA FE BA BY),让类加载器来识别。 加载的过程:
1.2 链接(Linking)(1) 验证(Verify)验证阶段用于检验被加载的类是否有正确的内部结构,确保Class文件字节流中包含信息符合当前虚拟机的要求,保证被加载类的正确性,不会危害虚拟机自身安全。 主要包括四种验证: ? ? ? ? 文件格式验证、元数据验证、字节码验证、符号引用验证 (2) 准备(Prepare)类准备阶段负责为类的静态变量分配内存,并设置默认初始值,即零值。 这里不包括用final修饰的static,因为final在编译的时候就会分配了,准备阶段会显式初始化。 (3) 解析(Resolve)将常量池中的二进制数据中的符号引用替换成直接引用的过程。 1.3 初始化(Initialization)初始化阶段就是执行类构造器方法<clinit>()的过程。(此方法不同于类的构造器,类的构造器是虚拟机视角下的<init>()方法)。即:
变量的赋值过程:在linking中的prepare操作中会先将类变量默认赋值为0,Initialization操作会按照语句在源文件中的顺序重新为其赋值。 注: 二、类加载器
2.1 引导类加载器(Bootstrap ClassLoader)由C/C++语言编写,不是ClassLoader子类。它用来加载 Java 的核心类,是用原生代码来实现的,并不继承自 java.lang.ClassLoader,负责加载JAVA_HOME中jre/lib/rt.jar里所有的class。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。 引导类加载器可以加载扩展类和应用程序类加载器,并为他们指定父类加载器。 2.2 扩展类加载器(Extension ClassLoader)由Java语言编写,派生于ClassLoader类,父类加载器是null。它从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK安装目录的jre/lib/ext子目录(扩展目录)下加载类库。如果用户创建的JAR文件放在此目录下,也会自动由扩展类加载器加载。 2.3 系统类加载器(Application ClassLoader)派生于ClassLoader类,父类加载器是扩展类加载器。负责加载环境变量classPath或系统属性java.class.path 指定路径下的类库。 该类加载 是程序中默认的类加载器,一般来说java应用的类都是由他来完成加载。通过ClassLoader.getSystemClassLoader()方法可以获取到该类加载器。
三、双亲委派机制Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将他的class文件加载到内存生成class文件。而且加载某个类的class文件时,Java虚拟机采用的双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。 ? ? ?双亲委派机制的优点:
四、类加载时机Java程序对类的使用方式分为:主动使用和被动使用。区别在于会不会导致类的初始化(Initialization)。 主动使用:
除了以上七种情况,其他使用Java类的方式都是被看作对类的被动使用,都不会导致类的初始化 补充: 在JVM中表示两个class对象是否为同一个类存在两个必要条件:
JVM必须知道一个类型是由启动类加载器加载的还是用户类加载器加载的。如果一个类型是由用户类加载器加载的,那么JVM会将这个类加载器的一个引用作为类型信息的一部分保存在方法区中。当解析一个类型到另一个类型的引用的时候,JVM需要保证这两个类的类加载器是相同的。 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 | -2025/2/22 2:17:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |