Java面试篇类加载过程详解(吊打面试官)

类加载过程详解


文章目录

  • 类加载过程详解
  • 类的生命周期
  • 类加载过程
      • 1.加载
      • 2.验证
      • 3.准备
      • 4.解析
      • 5.初始化
      • 6.类卸载


类的生命周期

类从被加载到虚拟机内存中开始到卸载内存为止,它的整个生命周期简单概括加载-验证-准备-解析-初始化-使用-卸载
验证、准备、解析这三个阶段可以统称为连接。
在这里插入图片描述

类加载过程

Class需要加载到JVM中之后才可以被使用,那么虚拟机时如何加载这些class文件呢?

1.加载

类加载过程的第一步:主要完成三件事

  • 通过全类名获取该类的二进制字节流
  • 将二进制字节流里的静态存储结构转换为方法区的数据结构
  • 在内存中生成一个代表该类的class对象,用于访问方法区的对象

加载这一步是由类加载器完成的,具体是哪个加载器完成是要由双亲委派选择的。

2.验证

验证这一步主要是为了检查class中二进制字节流是否符合《java虚拟机使用规范》,防止有害代码的入侵和错误信息,保障JVM的安全。会检查:文件格式、元数据、字节码、符号引用。

验证阶段示意图

文件格式验证这一步是基于该类的二进制字节流进行的主要目的是检查输入的字节流是否能被正确解析并成功导入方法区中,格式上符合描述一个 Java 类型信息的要求。除了这一阶段之外,其余三个验证阶段都是基于方法区的存储结构上进行的,不会再直接读取、操作字节流了。

方法区属于是 JVM 运行时数据区域的一块逻辑区域,是各个线程共享的内存区域。当虚拟机要使用一个类时,它需要读取并解析 Class 文件获取相关信息,再将信息存入到方法区。方法区会存储已被虚拟机加载的 类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据

3.准备

准备阶段是正式为类变量分配空间和赋初值的地方。

主要是对类变量(静态变量)进行分配

4.解析

解析阶段是将常量池的符号引用改为直接引用

5.初始化

初始化阶段是初始化方法<clinit()>方法的过程,是类加载的最后一步,这一步JVM才开始真正执行类中定义的java程序代码(字节码)。

6.类卸载

即类的实例对象被GC

写在满足三个条件:

  • 1.所有的实例化对象都已被GC,也就是堆中不存在类的实例对象。
  • 2.该类没有任何地方被引用
  • 该类的类加载器的实例被GC

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

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

相关文章

使用ESP32搭建简单的WiFi控制LED的Web服务器

在这篇博客中&#xff0c;我将展示如何使用ESP32或ESP8266开发板通过WiFi搭建一个简单的Web服务器&#xff0c;并使用它来控制一个LED的开关。首先确保esp32与自己的手机或者电脑在同一WiFi环境下 效果展示 led 项目准备 在开始之前&#xff0c;请确保你已经准备好以下材料&a…

MySQL中的CREATE EVENT 语句详解

CREATE EVENT 语句在 MySQL 中用于创建一个事件调度器&#xff08;Event Scheduler&#xff09;的事件。事件调度器允许你安排数据库任务&#xff08;如查询、数据更新等&#xff09;在将来的某个时间点自动执行&#xff0c;或者根据特定的时间间隔重复执行。这对于需要定期执行…

【HarmonyOS】关于鸿蒙消息推送的心得体会(二)

【HarmonyOS】关于鸿蒙消息推送的心得体会&#xff08;二&#xff09; 前言 推送功能的开发与传统功能开发还是有很大区别。首先最大的区别点就在于需要多部门之间的协同&#xff0c;作为鸿蒙客户端开发&#xff0c;你需要和产品&#xff0c;运营&#xff0c;以及后台开发一起…

泛型、Trait和生命周期(10)

泛型、Trait和生命周期 1.泛型数据类型1.1在函数定义中使用泛型1.2结构体定义中的泛型1.3枚举定义中的泛型1.4方法定义中的泛型1.5泛型代码的性能 2.Trait: 定义共同行为2.1定义trait2.2为类型实现trait2.3默认实现2.4trait作为参数2.5Trait Bound语法2.6通过 指定多个trait b…

golang语言 .go文件版本条件编译,xxx.go文件指定go的编译版本必须大于等于xxx才生效的方法, 同一个项目多个go版本文件共存方法

在go语言中&#xff0c;我们不关是可以在编译时指定版本&#xff0c; 在我们的xxx.go文件中也可以指定go的运行版本&#xff0c;即 忽略go.mod中的版本&#xff0c;而是当当前的go运行版本达到指定条件后才生效的xxx.go文件。 方法如下&#xff1a; 我们通过在xxx.go文件的头部…

vue3访问URL添加session变量

本文主要讲了我们在访问网址时候&#xff0c;为了实现一些免登录等效果&#xff0c;需要在会话Session中添加一些变量&#xff0c;已实现特定效果。 关键代码在于蓝色这部分&#xff1a; <script setup> import { ref } from vue import axios from axios const loginUrl…

java小白针对大数据多表联查的一些小思路,帮助新手学习

假设我的member_user里面有352599条数据&#xff0c;gp_project里面有1211974条数据 SELECT gp.*, mu.linkmanName , mu.linkmanPhone, mu.legalPersonName, mu.legalPersonPhone, mu.address, mu.registerArea FROM gp_project gp LEFT JOIN member_user mu ON mu.supplierId…

通过“微软蓝屏”事件对网络安全的思考

近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全技术公司“众击”提供的一个带有“缺陷”的软件更新&…

C++在高性能计算与游戏开发中的应用

在追求极致性能和用户体验的今天&#xff0c;C凭借其高效的执行效率和强大的控制能力&#xff0c;在高性能计算&#xff08;HPC&#xff09;和游戏开发领域大放异彩。无论是处理大规模数据集的并行计算&#xff0c;还是构建复杂、逼真的游戏世界&#xff0c;C都展现出了无可比拟…

04 HTML CSS JavaScript

文章目录 HTML1、HTML介绍2、快速入门3、基础标签4、图片、音频、视频标签5、超链接标签6、列表标签7、表格标签8、布局标签9、 表单标签 CSS1、 概述2、 css 导入方式3、 css 选择器4、 css 属性 JavaScript1、JavaScript简介2、JavaScript引入方式3、JavaScript基础语法4、Ja…

【C++刷题】优选算法——分治

颜色分类 void sortColors(vector<int>& nums) {int left -1, right nums.size();for (int i 0; i < right;) {if (nums[i] 0) {swap(nums[left], nums[i]);} else if (nums[i] 2) {swap(nums[--right], nums[i]);} else {i;}} }排序数组 // 快速排序 void…

Potree在web端显示大型点云模型文件

一、克隆项目代码&#xff08;准备好上网工具&#xff0c;得先有node.js npm 环境&#xff09; git clone https://github.com/potree/potree.git二、依赖安装&#xff08;换淘宝镜像能快一些&#xff09; cd potree npm install三、运行 npm start四、使用样例 打开浏览器…

44、PHP 实现数据流中的中位数(含源码)

题目&#xff1a; PHP 实现数据流中的中位数 描述&#xff1a; 如何得到一个数据流中的中位数&#xff1f; 如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位于中间的数值。 如果从数据流中读出偶数个数值&#xff0c;那么中位数就是所有数值排序之…

【Spring】SpringRetry重试机制和Spring异步任务发送操作结合应用场景实操,通俗易懂

平时调用一些第三方接口或者内部接口&#xff0c;可能出现处理异常或者超时或者意外因素&#xff0c;我们可以使用重试机制来为用户提高体验。 1.引用依赖 <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</a…

【Qt】文字换行

目录 Qt换行方式一方法二 参考文章 在Qt控件中经常遇到文字超出文本框&#xff0c;因此介绍几种换行方式 Qt换行 方式一 QLabel 设置setWordWrap(true);实现换行。但此方法对于多语言文本不太友好&#xff0c;可以在超出文本框时添加省略符&#xff0c;方法如下 //要显示的超…

单片机学习(18)--红外遥控器

红外遥控器 17.1红外遥控的基础知识1.红外遥控简介2.硬件电路3.基本发送和接收4.NEC编码5.遥控器键码6.51单片机的外部中断7.外部中断寄存器 17.2红外遥控的程序代码1.红外遥控&#xff08;1&#xff09;工程目录&#xff08;2&#xff09;main.c函数&#xff08;3&#xff09;…

vue 实战 tab标签页+el-card+流式布局+异步接口调用

<template><div><!-- 布局按钮 --><el-button click"dialogVisible true">布局配置查看</el-button><!-- 布局配置对话框 --><el-dialog :visible.sync"dialogVisible" title"布局配置查看" width"…

Invalid bound statement (not found)

Invalid bound statement (not found) 首先申明的是这个错误一般是使用mybatis方法没有找到或者参数不匹配等原因造成的&#xff01; 原本项目是使用eclipse运行&#xff0c;导入到idea之后&#xff0c;项目启动就报错 …Invalid bound statement (not found)… 解决办法&#…

Python 爬虫(爬取百度翻译的数据)

前言 要保证爬虫的合法性&#xff0c;可以从以下几个方面着手&#xff1a; 遵守网站的使用条款和服务协议&#xff1a;在爬取数据之前&#xff0c;仔细阅读目标网站的相关规定。许多网站会在其 robots.txt 文件中明确说明哪些部分可以爬取&#xff0c;哪些不可以。 例如&…

中电金信:AI数据服务

01 方案简介 AI数据服务解决方案为泛娱乐、电子商务、交通出行等行业提供数据处理、数据分析、AI模型训练等服务&#xff0c;通过自主研发的IDSC自动化数据服务平台与客户业务流程无缝衔接&#xff0c;实现超低延时的实时数据处理支持。 02 应用场景 智能医疗&#xff1a; 通…