JavaWeb——类的加载过程

news2024/11/26 17:24:50

目录

一、类加载的过程

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类又是用户自己提供的因此安全性就不能得到保证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis持久化AOF和RDB,学习总结篇!

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 前面笔者写了一篇关于Redis 数据结构和数据类型的博客总结,这篇博客总结一下关于 Redis 持久化。部分图片来自作者:小林哥,小林哥y…

JS debug跳过的几种方法

JS debug跳过的几种方法 第一种反调试解决方法: 禁用断点法 禁用所有断点,包括自己打的断点,无法调式。第二种反调试解决方法: 从来不执行法 在debug处 点击右键,选择 Nerver pause here,点击确定。第三种反调试解决方法: 条件…

常见的JS内置对象之数组

数组(Array) 1)定义数组 直接push的话,值放在了创建的大小之后,用下标进行操作值在创建大小里 创建两个空对象 2)数组的遍历: for in 循环 迭代数组:迭代出的是下标 拿到的不是值&am…

CnosDB x LangChain: 聊着天来查询时序数据库

本篇我们将主要介绍如何使用 LangChain 连接 CnosDB 数据库,实现使用自然语言和数据库的交流。 大模型等的相关话题已经霸榜半年有余,在讨论关注之余,CnosDB技术团队将大模型与人工智能相关技术与数据库开发与实践进行融合。继CnosDB全面整合…

实现最大子段和的计算,输入数据从文件读取。

1.设计思路   求解该题可以用分治法解题,总共有三种情况,最大子段在我们数组的左侧;最大子段在我们数组的右侧;最大子段跨过了左右两侧,在中间最大。第一种和第二种将两个子问题递归解出。分开的位置就是我们的中心位…

ios oc button 设置

Button调整内部的子控件的位置

图书借阅系统

系统描述 该图书借阅系统是一个用于图书馆或类似机构管理图书借阅流程的在线平台。系统主要包括管理员模块和读者模块,分别提供相应的功能和权限。 - 管理员模块: - 注册:允许管理员创建新的管理员账号。 - 登录:允许管理员使用账…

centos7 安装vmware17

vmware17 下载 官网 VMware Hong Kong - Delivering a Digital Foundation For Businesses | HK | HK 下载链接 Download VMware Workstation Pro 下载链接,直接点击下载即可 https://download3.vmware.com/software/WKST-1702-LX/VMware-Workstation-Full-17.0…

Unity自定义后处理——校色

Unity自定义校色后处理 大家好,我是阿赵。   之前介绍了一些后处理的做法,包括了PostProcessing和CommandBuffer。其实如果我们只是实现一些比较单一的全屏效果,也没必要搞那么复杂,直接在OnRenderImage里面写Graphics.Blit就可…

最近很火的 LangChain 你了解吗

最近 ChatGPT 很火,AIGC 很火,各类国产化 AI 很火。周边的 AI 工具集、框架也很火。各类新词也层出不穷。今天和大家学习和分享的是重量级新选手 LangChain。 一、什么是 LangChain LangChain 是一个 2023 年 1 月(v0.0.64)在 G…

网页聊天室测试

1.项目介绍: 该项目是一个基于网页的聊天室应用,具有用户注册、登录、会话列表、好友列表、发送消息等功能。下面是更详细的项目介绍: 用户注册和登录功能:用户可以通过输入用户名和设置密码来注册新账户,在注册过程中…

实施工程师需要了解的mysql知识

一、前言 做为实施工程师,在现场有时候是需要协助开发人员做一些简单的sql查询、更新动作的,不需要多复杂,下面就简单介绍下mysql的安装以及举一些最简单常用的sql用例。 二、安装mysql 2.1 下载安装包 第一步:在百度搜索"…

vue 通过多组复选框来过滤数据

1.通过if else 来筛选数据 <template> <div><div><label><input type"checkbox" v-model"checkedNames" value"北京"> 北京</label><label><input type"checkbox" v-model"chec…

使用python进行AI选股之同花顺问财

通过问财python库&#xff0c;可以输入中文就能获取AI选股结果&#xff0c;而不需要写很多代码来进行股票选取&#xff0c;如上图就是输入中文”均线多头排列的股票”获取的结果。本文主要介绍问财python库的选股功能和使用步骤。 什么是问财python库 同花顺i问财是同花顺旗下…

Echarts 定制化日历图

目录 改造一&#xff08;变化X轴、Y轴label&#xff09;&#xff1a; 改造二&#xff08;单元格、图例改造&#xff09;&#xff1a; 改造三&#xff08;tooltip、细节优化&#xff09;&#xff1a; 最近在做可视化&#xff0c;发现日历图挺有意思&#xff0c;分享一波吧&am…

SpringBoot项目打包Docker镜像

1、创建springboot项目&#xff0c;并在根目录新建Dockerfile文件 Dockerfile文件内容 FROM adoptopenjdk/openjdk8:jre8u-nightly ADD target/test-k8s-0.0.1-SNAPSHOT.jar test-k8s-0.0.1-SNAPSHOT.jar ENTRYPOINT ["java","-jar","/test-k8s-0.0.…

Python编程——字符串的拼接

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 前言 本文将讲解字符串的拼接与使用%进行拼接。 目录 ​编…

(二)Qt下多线程实现多个海康工业相机内触发采集回调取流显示

系列文章目录 提示&#xff1a;这里是该系列文章的所有文章的目录 第一章&#xff1a;&#xff08;一&#xff09;Qt下实现多个海康工业相机内触发采集回调取流显示 第二章&#xff1a;&#xff08;二&#xff09;Qt下多线程实现多个海康工业相机内触发采集回调取流显示 文章目…

单例模式之常见模式详解

单例模式之常见模式详解 单例模式的定义单例模式的分类饿汉模式懒汉模式 单例模式的主要特点单例模式的应用场景总结 单例模式的定义 单例模式是一种设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。 在单例模式中&#xff0c;类…

2023需求最高的编程语言:Python、JavaScript和Java

科技招聘平台 CodinGame 和 CoderPad 最新发布了一份 2023 年科技行业招聘报告&#xff0c;基于对 14000 名专业人士的调查&#xff0c;对 2023 年科技行业招聘人员和求职者可能面临的情况进行了深入分析。其中一些关键亮点包括&#xff1a; 59% 的开发人员没有计算机科学方面的…