当前位置: 首页 > news >正文

快速理解类的加载过程

当程序主动使用某个类时,如果该类还未加载到内存中,则系统会通过如下三个步骤来对该类进行初始化:

1.加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象;

2.链接:Java类的二进制代码合并到JVM的运行状态之中的过程。

(1)验证:确保加载的类信息符合JVM规范,没有安全方面的问题;

(2)准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配;(static是在内初始化之前就完成了)

(3)解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。()

3.初始化:

(1)执行类构造器<clinit>()方法的过程:类构造器<clinit>()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的(类构造器是构造类信息的,不是构造该类对象的构造器);(JVM去完成的)

(2)当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化;

(3)虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。

总结:

虚拟机把Class文件加载到内存,并对数据进行校验、转换解析和初始化,形成可以虚拟机直接使用的Java类型,即java.lang.Class,如下图:

接下来会对该三个步骤逐一进行解释。

一.类的加载

作用:查找和导入Class文件。

步骤:

1.通过一个类的全限定名获取定义此类的二进制字节流;(那么这个时候需要一个寻找器,来寻找获取我们的二进制字节流,而java中恰好有这么一段代码模块,可以实现通过类全名来获取此类的二进制字节流这个动作,并且将这个动作放到放到java虚拟机外部去实现,以便让应用程序决定如何获取所需要的类,实现这个动作的代码模块成为“类加载器”)

2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3.在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。(此时静态数据结构已经放进了方法区,但是此时我们没有办法去进行访问,java当中去访问数据的方法是通过引用去操作对象,然后通过对象去操作数据,所以还需要再堆当中去生成一个代表代表这个类的java.lang.Class对象,作为方法区中的数据访问入口)

在加载阶段完成之后,这个时候在内存当中,运行时数据区的方法区以及堆就已经有数据了:

(1)方法区:类信息,静态变量,常量;

(2)堆:代表被加载类的java.lang.Class对象。

及时编译之后的热点代码并不在这个阶段进入方法区。

类加载器:

类加载器作用是用来把类(class)装载进内存的,JVM 规范定义了如下类型的类的加载器:

二.类的链接

1.验证

作用:

验证只要是为了确保Class文件中的字节流包含的信息完全符合当前虚拟机的要求,并且还要求我们的信息不会危害虚拟机自身的安全,导致虚拟机的崩溃。

验证内容:

文件格式的验证、元数据验证、字节码的验证、符号引用的验证。

2.准备

作用:

为类的静态变量分配内存,并且初始化为当前类型的默认值。

解释:

1.这里不包含用final修饰的static,因为final在编译的时候就会分配了,准备阶段会显式初始化,这里不会为实例变量(也就是没加static)分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中;

2.进行分配内存的只是包括类变量(静态变量),而不包括实例变量,实例变量是在对象实例化时随着对象一起分配在java堆中的,通常情况下,初始值为零值,假设public static int a=1,那么a在准备阶段过后的初始值为0,不为1,这时候只是开辟了内存空间,并没有运行java代码,a赋值为1的指令是程序被编译后,存放于类构造器()方法之中,所以a被赋值为1是在初始化阶段才会执行。

3.解析

作用:

把类中的符号引用转换为直接引用:

(1)符号引用就是一组符号来描述目标,可以是任何字面量;

(2)直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

(因为再一个Class文件中,没有办法去表示引用关系,只能告诉你引用到10行或者20行这种,直接应用就表示你执行的位置在内存当中有一块具体的地址,比如说a指向b是符号应用,a指向b所在的位置0x01,在内存中这叫直接引用)

解释:

(1)解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进行;

(2)直接应用是与虚拟机内存布局相关的,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般是不相同的,如果有了直接引用,那引用的目标必定存在内存中;

(3)类缓存:标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。不过VM垃圾回收机制可以回收这些Class对象。(同一符号引用进行多次解析请求是很常见的,除invokedynanic指令以外,虚拟机实现可以对第一次解析结果进行缓存,来避免解析动作重复进行,无论是否真正执行了多解析动作,虚拟机需要保证的是在同一个实体中,如果一个引用符号之前已经被成功解析过,那么后续的引用能析请求就应当一直成功,同样的,如果第一次解析失败,那么其他指令对这个符号的解析请求也应该收到相同的异常)

(4)inDy(invokedynamic)是java7引入的一条新的虚拟机指令,这是自 1.0 以来第一次引入新的虚拟机指令,到了 java 8 这条指令才第一次在java 应用,用在 lambda 表达式中,indy 与其他 invoke 指令不同的是它允许由应用级的代码来决定方法解析。

三.类的初始化

作用:

初始化阶段是执行类构造器Clinit()方法的过程,或者讲得通俗易懂些,加载和链接以外的工作都需要在初始化中去完成。

在准备阶段,类变量已赋过一次系统要求的初始值,而在初始化阶段,则是根据自己通过程序制定的主观计划去初始化变量和其他资源,比如赋值。

什么时候发生类初始化:

1.类的主动引用(一定会发生类的初始化):

(1)当虚拟机启动,先初始化main方法所在的类;

(2)new一个类的对象;

(3)调用类的静态成员(除了final常量)和静态方法;

(4)使用java.lang.reflect包的方法对类进行反射调用;

(5)当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类;

2.类的被动引用(不会发生类的初始化):

(1)当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量不会导致子类初始化;

(2)通过数组定义类引用,不会触发此类的初始化;

(3)引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)。

在Java中对类变量进行初始值设定有两种方式:

1.声明类变量是指定初始值;

2.使用静态代码块为类变量指定初始值。

按照程序逻辑,必须把静态变量定义在静态代码块的前面,因为两个的执行是会根据代码编写的顺序来决定的,顺序搞错了可能会影响你的业务代码。

JVM初始化步骤:

1.假如这个类还没有被加载和连接,则程序先加载并链接该类;

2.假如该类的直接父类还没有被初始化,则先初始化其直接父类;

3.假如类中有初始化语句,则系统依次执行这些初始化语句。

四.举例

代码如下:

public class Test {public static void main(String[] args) {A a = new A();System.out.println(A.m);/*1.加载到内存 ,会产生一个类对应class对象2.链接 ,链接结束后 m = 03.初始化 m= 100:<clinit>(){System.out.println("A类静态代码块初始化”);m = 300;m=100}*/}
}class A {static {System.out.println("A类静态代码块初始化");m = 300;}static int m = 100;public A() {System.out.println("A类的无参构造初始化");}
}

输出结果:

A类静态代码块初始化
A类的无参构造初始化
100

 大概流程如下:

首先在方法区产生了一些该类的静态数据,然后在加载的类的时候,就产生了对应的class,然后看main()方法,main()方法后就开始链接,此时m有一个初始值0,等链接完没有问题的时候,就开始执行代码,此时new A(),就产生了一个A类的对象,这个对象就会去找到自己的Class类(指向),通过A类的数据结构,给A类对象赋值(拿到数据),赋值完成后,通过clinit()方法初始化数据,得到m等于100。

相关文章:

快速理解类的加载过程

当程序主动使用某个类时&#xff0c;如果该类还未加载到内存中&#xff0c;则系统会通过如下三个步骤来对该类进行初始化&#xff1a; 1.加载&#xff1a;将class文件字节码内容加载到内存中&#xff0c;并将这些静态数据转换成方法区的运行时数据结构&#xff0c;然后生成一个…...

monorepo代码管理框架

1. 新建 vue3-component 文件夹 2. 运行pnpm init 3. pnpm i vue typescript 4. 新建.npmrc shamefully-hoisttrue link-workspace-packagestrue 5. ts文件配置 pnpm tsc --init 默认.bin路径下的tsc 6. 新建pnpm-workspace.yaml packages:- packages/** # all packages- p…...

LabVIEW实现蓝牙通信

目录 1、蓝牙通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...

R环境配置 以及Debug方法 (VSCode, conda, 远程R)

生物信息学中的R环境配置 以及Debug方法 开始设置1、建议使用VSCode conda 远程R2、 VSCode配置安装插件安装好插件后&#xff0c;远程设置链接成功后&#xff0c;设置项目 3、 linux conda 和 远程R配置4、VScode 远程访问R环境下面配置远程R 5、开始Debug新建个R文件&#…...

ComfyUI 与 Stable Diffusion WebUI 的优缺点比较

ComfyUI与Stable Diffusion WebUI都是AI绘画领域比较知名两款产品&#xff0c;两者存在诸多差异&#xff0c;本篇就带你熟悉二者的优劣&#xff0c;方便自己做出决策。 界面与操作 ComfyUI&#xff1a;界面简洁直观&#xff0c;通过节点和连线的方式构建工作流&#xff0c;用…...

Ubuntu 系统下安装 Nginx

一、Nginx是什么 是一个高性能的 HTTP 和反向代理 web 服务器&#xff0c;同时也提供了 IMAP/POP3/SMTP 服务。 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在BSD-like 协议下发行。其特点是占有内存少&…...

【Qt】drawText字体大小问题探究

背景 软件的一个功能是&#xff1a; 打开图片在图片上绘制序号&#xff0c;序号的样式是圆圈内包含数字将带有序号的图片打印出来 实现思路也很简单&#xff0c;在屏幕上显示时重写paintEvent函数&#xff0c;利用QPainter完成图片和序号的绘制。打印时只需要将QPainter对应…...

视频汇聚平台:Liveweb视频流媒体平台视频监控系统解决方案

数字化技术在安防领域的广泛应用已经成为公安等重要执法部门的重要趋势&#xff0c;主要得益于无线网络通信技术和计算机技术的快速进步。传统的视频监控系统存在诸多局限&#xff0c;例如只能进行现场监视&#xff0c;报警信息传输简单&#xff0c;无法远距离传输视频信号&…...

Android开发中有关MediaPlayer 播放.mp3文件使用之一

我们在项目中&#xff0c;经常会添加一个简单的语音提示&#xff1a;我们通常会选择MediaPlayer播放SD文件中的.MP3文件或者存到assets下的.mp3文件。正常使用流程如下&#xff1a; 一、播放assets下的.mp3文件 根据assets获取需要播放的文件名 getApplicationContext().getAs…...

Leetcode经典题11--加油站

题目描述 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组 gas 和…...

23种设计模式之状态模式

目录 1. 简介2. 代码2.1 State &#xff08;定义抽象状态接口&#xff09;2.2 StartState &#xff08;实现具体状态类&#xff09;2.3 EndState &#xff08;实现具体状态类&#xff09;2.4 Context &#xff08;定义上下文类&#xff09;2.5 Test &#xff08;测试类&#xf…...

大模型的构建与部署(3)——数据标注

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 数据标注的重要性 1.1 增强数据可解释性 数据标注通过为原始数据添加标签或注释,显著增强了数据的可解释性。在机器学习和深度学习领域,模型的训练依赖于大量带标签的数据。这些标签不仅帮助…...

windows11 专业版 docker desktop 安装指南

家庭中文版需升级专业版&#xff0c;家庭版没有hyper-v。 开始运行optionalfeatures.exe打开windows功能 安装wsl2 步骤 1 - 启用适用于 Linux 的 Windows 子系统步骤 2 - 检查运行 WSL 2 的要求步骤 3 - 启用虚拟机功能步骤 4 - 下载 Linux 内核更新包 步骤 1 - 启用适用于 L…...

mixed strategy

混合策略和期望收益的基本概念 在博弈论中&#xff0c;混合策略是指参与者以一定的概率选择不同的纯策略。期望收益则是在考虑这些概率的情况下&#xff0c;参与者所能获得的平均收益。 以“石头 - 剪刀 - 布”游戏为例 游戏规则回顾 石头胜剪刀&#xff0c;剪刀胜布&#xff0…...

登上Nature和CVPR!小波变换+UNet上大分!

最近UNet又出现了不少新成果&#xff0c;结合小波变换屡登Nature子刊和CVPR24&#xff01;比如三路径U-Net模型&#xff0c;利用Haar小波变换大幅提高系统整体性能&#xff1b;再比如利用小波变换的特性来改进U-Net架构的MLWNet网络&#xff0c;性能猛超SOTA&#xff01; 原因…...

2_使用 HTML5 Canvas API (1) --[HTML5 API 学习之旅]

1.在页面中加入 canvas 在网页中加入 <canvas> 元素可以通过简单的 HTML 和 JavaScript 实现。以下是两个具体的示例&#xff0c;展示了如何在页面中使用 <canvas> 绘制图形和处理用户交互。 示例 1: 简单的静态绘图 这个例子展示了一个基础的 <canvas> 应…...

梳理你的思路(从OOP到架构设计)_UML应用:业务内涵的分析抽象表达01

目录 1、 系统分析(System Analysis) 系統分析的涵意 业务(领域)知识 业务内涵 业务(领域)概念 2、举例(一) &#xff1a;东方传说 UML与建模工具 1、 系统分析(System Analysis) 系統分析的涵意 许多人在学习系统分析(System Analysis)时&#xff0c;常迷失于其字面上…...

redis集群安装部署 redis三主三从集群

redis集群安装部署 redis三主三从集群 1、下载redis2、安装redis集群 三主三从3、配置redis开机自启动3.1、建立启动脚本3.2、复制多份redis启动脚本给集群使用3.3、添加可执行权限3.4、配置开机自启动 1、下载redis 本次redis安装部署选择当前最新的稳定版本7.4.1 下载链接: …...

【PHP】部署和发布PHP网站到IIS服务器

欢迎来到《小5讲堂》 这是《PHP》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言安装PHP稳定版本线程安全版解压使用 PHP配置配置文件扩展文件路径…...

大模型qiming面试内容整理-系统设计与架构

在大模型和机器学习相关岗位的面试中,系统设计与架构的考察通常会涉及如何设计一个可扩展、可靠且高效的机器学习系统,特别是在面对大规模数据和复杂模型时。这一部分的考察不仅测试候选人对机器学习和深度学习的理解,还会评估其如何设计实际生产环境中的系统来满足需求。以…...

【Reading Notes】Favorite Articles from 2024

文章目录 1、January2、February3、March4、April5、May6、June7、July8、August9、September10、October11、November12、December 1、January 2、February 3、March Sora外部测试翻车了&#xff01;3个视频都有Bug&#xff08; 2024年03月01日&#xff09; 不仔细看还真看不…...

Qt-chart 画柱状图

记录下&#xff0c;记录下 效果图 直接上代码 // 创建柱状系列 QBarSeries *series new QBarSeries();// 创建数据集 QBarSet *setTar new QBarSet(("tar"));QBarSet *setReality new QBarSet(("reality"));//添加柱状数据*setTar << 1<<…...

【深入理解Java线程池】

深入理解Java线程池 Java线程池是Java并发编程中的一个重要概念&#xff0c;它提供了一种管理和复用线程的机制&#xff0c;可以显著减少创建和销毁线程的开销&#xff0c;提高系统的响应速度和吞吐量。以下是对Java线程池的详细解析&#xff1a; 一、线程池的基本概念 线程…...

honle电源控制器维修UV灯高压电源EVG EPS200

UV电源控制器维修&#xff1b;honle电源维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EPS 60/120、EPS 100、EPS200、EPS 220、EPS 340、LED Spot 100、UV2000F HONLE UV灯高压电源控制器故障包括&#xff1a; 1、电压不稳&#…...

java中List集合小练习

题目&#xff1a;将1~100之间所有正整数存放在一个List集合中&#xff0c;并将集合索引位置时10的对象从集合中移除。 代码&#xff1a; import java.util.ArrayList; import java.util.List;public class ListTest {public ListTest(){List<Integer> listnew ArrayLis…...

【STM32练习】基于STM32的PM2.5环境监测系统

一.项目背景 最近为了完成老师交付的任务&#xff0c;遂重制了一下小项目用STM32做一个小型的环境监测系统。 项目整体示意框图如下&#xff1a; 二.器件选择 单片机&#xff08;STM32F103&#xff09;数字温湿度模块&#xff08;DHT11&#xff09;液晶显示模块&#xff08;0.8…...

JS哪些操作会造成内存泄露?

在 JavaScript 中&#xff0c;内存泄露是指程序不再使用的内存没有被释放&#xff0c;从而导致内存的持续增长&#xff0c;最终可能导致性能下降或应用崩溃。以下是一些常见的可能导致内存泄露的操作和情况&#xff1a; 1. 全局变量 如果不小心创建了全局变量&#xff0c;可能…...

《知识拓展 · 统一建模语言UML》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

GNSS 全球卫星导航系统(Global Navigation Satellite System): 卫星授时

文章目录 引言I GNSSGNSS三大核心能力卫星系统、区域性的系统以及增强系统II 卫星授时GNSS是如何实现授时优势引言 GNSS指的是全球卫星导航系统,是能在全球范围内提供导航服务的卫星导航系统的通称。 美国GPS、俄罗斯GLONASS、中国北斗卫星导航系统和欧洲GALILEO,是联合国全…...

【数据结构】循环队列原理与代码

理论 存在的意义&#xff1a; 将顺序队列从逻辑上视为一个环。解决“假溢出”&#xff08;出队入队连续操作后两个指针均到数组末端maxsize-1处&#xff0c;虽然队里没有元素但无法让元素进队&#xff09;。两种定义 1.题目是队列非空时队头指针和队尾指针分别指向队头元素和队…...

Kettle Doris Plugin编译过程

起因 公司的数据中台产品用的doris作为数据仓库&#xff0c;用kettle作为etl引擎&#xff0c;但是表输出组件太慢了。偶然有一天发现doris提供了kettle组件&#xff0c;但是需要自己编译&#xff0c;于是就开始自己编译。 坑 因为kettle的依赖包在m2&#xff08;中央仓库&am…...

Day10 苍穹外卖项目 订单搜索、各个状态的订单统计、查询订单详细、接单、拒单、取消订单、派送订单、完成订单

目录 1.订单搜索 1.1 需求分析和设计 1.2 接口设计 1.2 代码实现 1.2.1 admin/OrderController 1.2.2 OrderService 1.2.3 OrderServiceImpl 2.各个状态的订单数量统计 2.1 需求分析和设计 2.2 接口设计 2.3 代码实现 2.3.1 admin/OrderController 2.3.2 OrderService 2.3.3 Or…...

你知道OSI参考模型是什么吗?

你知道OSI参考模型是什么吗&#xff1f; 一. OSI模型图解二. OSI七层模型三. OSI模型的特点四. OSI模型与TCP/IP模型的对比五. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱…...

《开源数据:开启信息共享与创新的宝藏之门》

《开源数据&#xff1a;开启信息共享与创新的宝藏之门》 一、开源数据概述&#xff08;一&#xff09;开源数据的定义&#xff08;二&#xff09;开源数据的发展历程 二、开源数据的优势&#xff08;一&#xff09;成本效益优势&#xff08;二&#xff09;灵活性与可定制性&…...

机器学习之学习范式

机器学习的四种主要范式分别是&#xff1a;监督学习、非监督学习、强化学习和半监督学习。以下是每种范式的详细介绍&#xff1a; 1. 监督学习&#xff08;Supervised Learning&#xff09; 定义&#xff1a; 通过已标注的数据训练模型&#xff0c;以预测或分类未知数据。 目…...

计算机网络技术基础:5.数据通信系统

一、数据通信的基本概念 1.信息 信息是对客观事物的运动状态和存在形式的反映&#xff0c;可以是客观事实的形态、大小、结构、性能等描述&#xff0c;也可以是客观事物与外部之间的联系。信息的载体可以是数字、文字、语音、图形和图像等。计算机及其外围设备产生和交换的信息…...

ubuntu下anconda装pytorch

1、禁用nouveau sudo vim /etc/modprobe.d/blacklist.conf 在文件最后部分插入以下两行内容 blacklist nouveau options nouveau modeset0 更新系统 sudo update-initramfs -u 重启系统 2、装nvidia驱动 卸载原来驱动 sudo apt-get remove nvidia-* &#xff08;若安装…...

【深入理解MySQL索引】

深入理解MySQL索引 MySQL索引是一种数据结构&#xff0c;用于帮助快速查找和检索数据库表中的数据。以下是对MySQL索引的详细解释&#xff0c;并附有相应的代码示例以加深理解。 一、索引的原理及作用 原理&#xff1a;索引是以数据库表中的“列”为维度建立的&#xff0c;通…...

Linux 中批量添加cron定时任务的方法

目录 方法一&#xff1a;通过 crontab 命令批量添加方法二&#xff1a;通过直接修改 crontab 文件 方法一&#xff1a;通过 crontab 命令批量添加 1、先将需要添加 cron 执行的多条定时任务写入一个文本文件 例如&#xff1a; 0 3 * * * /bin/bash /root/work/job/MySQLBack.…...

【OSS】php使用oss存储

阿里云oss官方文档&#xff1a;文档 1、前期工作 创建阿里云账号&#xff0c;登录创建bucket&#xff0c;注意修改权限&#xff0c;要不然可能读取不到 申请accessKeyId和accessKeySecret accessKey 2、项目中安装OSS扩展 composer require aliyuncs/oss-sdk-php3、基础使…...

个人ffmpeg笔记(一)

环境安装 QT环境安装 运行qt…run安装 下载地址&#xff1a;https://download.qt.io/archive/qt/ 下载地址&#xff1a;https://download.qt.io/archive/qt/5.12/5.12.10/ sudo apt install --reinstall libxcb-xinerama0 解决xcb问题 Ubuntu16.04打开Qt显示/home/user/.co…...

Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机

文章目录 4 Plotter类的方法4.3 渲染器内的物体操作4.3.1 添加物体4.3.2 移除物体4.3.3 渲染器的内容列表 4.4 相机控制4.4.1 访问相机对象4.4.2 重置相机状态4.4.3 移动相机位置4.4.4 改变相机焦点4.4.5 改变相机朝向的平面4.4.5 旋转相机4.4.6 对齐相机的上朝向4.4.7 缩放 ve…...

关于QMessageBox的一些使用总结和避坑指南

参考学习 Qt中QMessageBox的用法—看这一篇就够了 Qt&#xff1a;使用QMessageBox弹出标准对话框 QMessageBox模态与非模态及QT中的exec() 如何调整QMessageBox的大小 QSS 自定义QMessageBox python QMessageBox设置标签和按钮居中、中文按钮 使用建议 经过查看多方的资料&…...

LearnOpenGL学习(高级OpenGL -> 高级GLSL,几何着色器,实例化)

高级GLSL 内建变量 顶点着色器 gl_PointSoze : float 输出变量&#xff0c;用于控制渲染 GL_POINTS 型图元时&#xff0c;点的大小。可用于粒子系统。将其设置为 gl_Position.z 时&#xff0c;可以使点的距离越远&#xff0c;大小越大。创建出类似近视眼看远处灯光的效果 gl…...

for X_batch, y_batch in dataloader ,其中y_batch想转成list

for X_batch, y_batch in dataloader &#xff0c;其中y_batch想转成list for X_batch, y_batch in dataloader:# y_batch数据类型的是 tensor组成的list# 初始化一个空列表来存储展平后的数据y_batch_flat []# 遍历y_batch 这个list中的每个张量for tensor in y_batch:# 展平…...

Kruskal最小生成树算法正确性证明

Kruskal: 每次考虑最短一条边, 如果会形成回路则不选择该边, 如果不会形成回路则选择该边, 直到选出了n-1条边 要点: 每次都选择不会形成回路的最短边 数学归纳法 ① n<2时, 显然成立 ② 设n k时成立, 则当n k1时: 将图划分为 子图A(k) 和 B(1) ∵ n k时成立 ∴ A(k)可…...

操作系统(12)内存分配

前言 操作系统内存分配是操作系统内存管理的重要组成部分&#xff0c;涉及将物理内存分配给各个程序以使用的过程。 一、内存分配的基本概念 内存分配指的是操作系统将物理内存分配给程序以使用。操作系统通过内存分配&#xff0c;确保每个程序都能获得足够的内存资源来执行其任…...

oracle client linux服务器安装教程

p13390677_112040_Linux-x86-64_4of7.zip 安装前&#xff0c;确认/etc/hosts文件已配置正确 cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.2…...

生信技能65 - SRA数据库公共数据自动化下载及SRA批量自动化拆分

根据NCBI Metadata数据表,实现SRA数据库公共数据自动化下载及SRA批量自动化拆分。 1. 程序逻辑 根据SraRunTable.csv自动从公共数据库下载SRA文件 ;模式0(默认)为下载模式,模式1为拆分模式,拆分支持进度显示;提取Metadata关键信息数据,重新写入新的文本文件。2. 运行示…...

ubuntu+ros新手笔记(五):初探anaconda+cuda+pytorch

深度学习三件套&#xff1a;初探anacondacudapytorch 系统ubuntu22.04 ros2 humble 1.初探anaconda 1.1 安装 安装过程参照【详细】Ubuntu 下安装 Anaconda 1.2 创建和删除环境 创建新环境 conda create -n your_env_name pythonx.x比如我创建了一个名为“py312“的环境…...