【JVM】JVM类加载机制

JVM类加载机制

  • 加载
    • 双亲委派模型
  • 验证
  • 准备
  • 解析
  • 初始化

JVM的类加载机制,就是把类,从硬盘加载到内存中

Java程序,最开始是一个Java文件,编译成.class文件,运行Java程序,JVM就会读取.class文件,把文件的内容,放到内存中,并且构造成.class类对象

加载

这里的加载是整个类加载的一个阶段,他和类加载是不同的

在整个类加载的过程中 主要任务就是找到.class文件 打开文件 读取文件内容 ,并且尝试解析格式

双亲委派模型

双亲委派模型 描述类加载的过程中 如何找到.class文件

JVM加载.class文件的时候,需要用到"类加载器"模块,JVM中自带了三个类加载器 Bootstrap ClassLoader,Extension ClassLoader,Application ClassLoader

此处的三个类加载器有"父子关系",在一个对象内有一个parent引用指父类加载器实例
在这里插入图片描述
在这里插入图片描述

验证

检查当前.class文件的格式 是否符合要求

.class文件虽然是二进制文件 但是内部也是有一定结构的

  1. 魔数(magic number) .class文件的开头四个字节是一个固定的魔数,用于标识该文件是否为有效的.class文件

  2. 版本信息 两个字节的版本号 表示编译器的主版本和次版本号,用于确定使用的Java编译器的版本

  3. 常量池(constant pool) 常量池是 .class 文件中最重要的部分之一,它存储了类、接口、字段、方法等元素的符号引用和常量值。常量池是一个表结构,以 1 开始计数,包含了若干个常量池项。

  4. 访问标志 访问标志用于描述类或接口的访问权限和特性,如是否为 public、final、abstract 等。

  5. 类索引 类索引指向常量池中类或接口的描述符;父类索引指向常量池中父类的描述符;接口索引表列出了实现的接口的描述符。

  6. 字段表和方法表 字段表包含了类或接口中定义的所有字段的信息,如名称、类型、修饰符等;方法表包含了类或接口中定义的所有方法的信息,如名称、参数类型、返回类型、修饰符等。

  7. 属性表 属性表包含了类、字段和方法的附加信息,如编译器生成的代码、注解等。属性表是可选的,可以包含零个或多个属性。

总的来说 一个Java文件里的所有信息 在.class文件中都会有所体现

准备

准备阶段是正式为类中定义的变量,即静态变量 分配内存并设置变量初始值

解析

Java虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程

.class文件中 不知道字符串真实的内存地址是在哪里,只知道一个相对的偏移量 也就是知道字符串的内容在.class文件的哪个地方 等到字符串内容加载到内存之后,就可以把真实 的地址,替换到刚才的符号引用这里了

初始化

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

在这里插入图片描述

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

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

相关文章

RabbitMQ概述,死信队列

RabbitMQ(Rabbit Message Queue)是一个开源的消息队列中间件,它实现了高级消息队列协议(AMQP)并提供可靠的消息传递机制。RabbitMQ 在分布式系统中广泛用于消息传递和事件驱动的架构。以下是一些 RabbitMQ 的重要知识点…

阿里云2023年双十一优惠活动整理

随着双十一的临近,阿里云也为大家准备了一系列优惠活动。作为国内知名的云服务提供商,阿里云在双十一期间推出了多种优惠政策和福利,让用户在享受优质云服务的同时,也能节省一些费用。本文将对阿里云双十一优惠活动进行详细整理&a…

25.0 MySQL 数据库概述

1. 数据库介绍 1.1 简介 数据库是用于存储, 管理和组织数据的一种技术.使用数据库有以下几个重要的原因: * 1. 数据的持久化存储: 数据库可以将数据持久地保存在磁盘上, 确保数据在计算机系统关闭或发生故障时不会丢失.这样可以保证数据的安全性和可靠性.* 2. 数据共享和协作…

工程管理系统源码之全面+高效的工程项目管理软件

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…

软考高级系统架构设计师系列之:快速掌握软件工程核心知识点

软考高级系统架构设计师系列之:快速掌握软件工程核心知识点 一、软件开发方法二、软件开发模型三、软件开发模型-瀑布模型四、软件开发模型-经典模型汇总五、软件开发模型-增量模型与螺旋模型六、软件开发模型-V模型七、软件开发模型-构件组装模型八、软件开发模型-统一过程九…

【nginx】监听80端口不生效问题

技巧:查询当前nginx监听的端口号有哪些 sudo netstat -tulpn | grep nginx 我是学自这篇文章 Nginx在配置监听80端口不生效问题_nginx启动监听不到9090端口_乌鸦啊的博客-CSDN博客Nginx安装之后在/etc/nginx/nginx.conf配置文件引用其它文件的配置,如…

Flink kafka 数据汇不指定分区器导致的问题

背景 在flink中,我们经常使用kafka作为flink的数据汇,也就是目标数据的存储地,然而当我们使用FlinkKafkaProducer作为数据汇连接器时,我们需要注意一些注意事项,本文就来记录一下 使用kafka数据汇连接器 首先我们看…

PHP和JAVA AES加解密问题

1.问题 php加密的java不能正常机密&#xff0c;java加密的php不能正常解密 2.前置参数 key 32位 iv 16位 3.问题解决 因为key是32位的&#xff0c;所以参数需要$methodAES-256-CBC,$options1 4.PHP代码 <?php /**** Created by PhpStorm* User: Noah* Date: 2023/10/10*…

[QCM6125][Android13] 屏蔽Launcher3桌面的搜索栏

文章目录 开发平台基本信息解决方法 开发平台基本信息 芯片: QCM6125 版本: Android 13 kernel: msm-4.14 解决方法 去掉原生Launcher3桌面的搜索栏 --- a/packages/apps/Launcher3/res/layout/search_container_workspace.xmlb/packages/apps/Launcher3/res/layout/search…

SpringBoot面试题3:Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? Spring Boot 的核心注解是 @SpringBootApplication。 @SpringBootApplication 是一…

纽交所上市公司安费诺宣布将以1.397亿美元收购无线解决方案提供商PCTEL

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;纽交所上市公司安费诺(APH)宣布将以每股7美元现金&#xff0c;总价格1.397亿美元收购无线解决方案提供商PCTEL(PCTI)。 该交易预计将在第四季度或2024年初完成。 Lake Street Capital Markets担任…

1.SpringSecurity -快速入门、加密、基础授权

SpringSecurity简介 文章目录 SpringSecurity简介一、基本概念1.1 认证&#xff08;Authentication&#xff09;方式1.2 会话(Session)介绍1.3 授权(Authorization)介绍1.4 RBAC 二、SpringSecurity入门2.1 快速入门2.1.1 Maven坐标2.1.2 接口2.1.3 源码 2.2 配置文件配置用户名…

[netty-websocket-boot-starter] 轻量、高性能的WebSocket框架

简介 这是一个轻量级、高性能的基于 Netty 的 WebSocket 框架&#xff0c;提升你的 WebSocket 开发体验&#xff0c;为 Spring Boot 带来全新的 WebSocket 功能。 该项目使你可以轻松集成 WebSocket 到你的 Spring Boot 项目中&#xff0c;提供了 Tomcat WebSocket 的简单性&a…

[QCM6125][Android13] 默认允许使用usb权限

文章目录 开发平台基本信息问题描述解决方法 开发平台基本信息 芯片: QCM6125 版本: Android 13 kernel: msm-4.14 问题描述 设备有usb打印机&#xff0c;调用UsbManager进行打印时&#xff0c;会弹框请求使用usb权限&#xff1b;客户要求能够自动授权usb权限&#xff0c;应…

Kotlin中的算数运算符

在Kotlin中&#xff0c;我们可以使用各种算术运算符来进行数值计算和操作。下面对这些运算符进行详细描述&#xff0c;并提供示例代码。 正号&#xff08;正数&#xff09;和负号&#xff08;负数&#xff09;&#xff1a; 正号用于表示一个正数&#xff0c;不对数值进行任何…

微信小程序前端生成动态海报图

//页面显示<canvas id"myCanvas" type"2d" style" width: 700rpx; height: 600rpx;" />onShareShow(e){var that this;let user_id wx.getStorageSync(user_id);let sharePicUrl wx.getStorageSync(sharePicUrl);if(app.isBlank(user_i…

Linux性能优化--使用性能工具发现问题

9.0 概述 本章主要介绍综合运用之前提出的性能工具来缩小性能问题产生原因的范围。阅读本章后&#xff0c;你将能够&#xff1a; 启动行为异常的系统&#xff0c;使用Linux性能工具追踪行为异常的内核函数或应用程序。启动行为异常的应用程序&#xff0c;使用Linux性能工具追…

【AI】了解人工智能、机器学习、神经网络、深度学习

深度学习、神经网络的原理是什么&#xff1f; 深度学习和神经网络都是基于对人脑神经系统的模拟。下面将分别解释深度学习和神经网络的原理。深度学习的原理&#xff1a;深度学习是一种特殊的机器学习&#xff0c;其模型结构更为复杂&#xff0c;通常包括很多隐藏层。它依赖于神…

一文全面了解:react-antd-admin 如何封装 axios

在React中封装Axios并添加请求拦截、响应拦截和错误处理是一个常见的需求,可以通过创建一个包装的Axios实例来实现。以下是一个简单的示例,展示如何在React中封装Axios: 首先,确保你已经安装了Axios,如果没有安装,可以使用以下命令进行安装: npm install axios然后,你…

C#中lock 和 ReaderWriterLock 的使用总结

线程锁是多线程并发共享数据&#xff0c;保证一致性的工具。多线程可以同时运行多个任务但是当多个线程同时访问共享数据时&#xff0c;可能导致数据不同步。当有多个线程访问同一对象的加锁方法或代码块时&#xff0c;同一时间只有一个线程在执行&#xff0c;其余线程必须要等…