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

多线程篇-3--java内存模型(主内存,共享内存,三大特性,指定重排)

Java内存模型

Java Memory Model,简称JMM,本身是一种抽象的概念,实际上并不存在,它描述的是一组规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。

(1)、到底规范了什么?

1、定义程序中各种变量的访问规则。
2、把变量值存储到内存的底层细节。
3、从内存中取出变量值的底层细节。

(2)、标准流程

1、所有变量存储在主内存(即:所有变量都在堆内存开辟)
2、主内存是虚拟机内存的一部分(即:jvm的内存分为堆内存,栈内存等)
3、每条线程有自己的工作内存(即:每个线程需要开辟属于自己的独立空间)
4、线程的工作内存保存变量的主内存副本(即:每个线程需要哪些变量,会先从主内存加载到自己的独立空间中)
5、线程对变量的操作必须在工作内存中进行(即:每个线程只能在自己的独立空间中工作,彼此是隔离的)
6、不同线程之间无法直接访问对方工作内存中的变量(即:每个线程之间是相互隔离的,不能看到对方的空间)
7、线程间变量值的传递均需要通过主内存来完成(即:线程之间想要通信,必须先将自己的副本写回到主内存中,其他线程在从主内存中读取到其他线程写的数据)

理解:
由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存空间(通常也称为栈内存空间),工作内存是每个线程的私有数据区域。而Java内存模型中规定所有变量都存储在主内存,主内存是共享区域,所有线程都可以访问。但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写会主内存,不能直接在主内存中操作变量。各个线程中的工作内存中存储着主内存中的变量副本拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成。
(实际创建创建线程开辟的空间是栈内存空间,栈内存中保存的是变量的引用(=前半的定义),真正变量数据(=右边new的对象)还是在堆内存中,不过副本引用都是在堆内存新开辟出来的,所以彼此之间还是隔离的。)

其简要访问过程图例:
在这里插入图片描述

(3)、主内存和工作内存

1、主内存(共享内存)

主内存(共享内存)是所有线程共享的内存区域,主要存储实例的数据(即:new出来的对象)。如:每个对象的实例变量、数组元素和静态变量等都存储在主内存中。
在Java中,对象和变量都存储在堆内存中,而每个线程有自己的栈内存来保存方法调用和局部变量的信息。当多个线程需要操作同一个对象或变量时,这些对象或变量就成为了共享数据,存在于共享内存中。共享内存使得线程间通信成为可能,但也带来了并发控制的问题,比如竞态条件(race condition)。

主要包含区域:
1、Java堆中对象实例数据部分(堆内存)
2、对应于物理硬件的内存(物理内存)

2、工作内存

工作内存是指每个线程独有的内存空间,存储了该线程使用的变量的副本。线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,不能直接操作主内存中的变量。(即使是volatile修饰的变量,也会在工作内存中创建变量副本,在从主内存中读取数据到副本中。在运算操作时,也都是先从主内存加载到工作内存副本中,再从副本中取出做运算)。

主要包含区域:
1、Java栈中的部分区域(栈内存)
2、优先存储于寄存器和高速缓存

(4)、内存模型的三大特性

1、原子性

(1)、概念
原子性是指一个操作或多个操作要么全部执行并且执行过程中不会被任何因素打断,要么完全不执行。
在多线程环境中,如果某个操作不是原子的,那么在执行过程中可能会被其他线程中断,导致中间状态被其他线程看到,从而引发各种并发问题,如竞态条件(race condition)、数据不一致等。

(2)、常用保证原子性的方法
synchronized,原子类(AtomicInteger等),Lock等。

(3)、代码示例

import java.util.concurrent.atomic.AtomicInteger;public class AtomicCounter {private AtomicInteger count = new AtomicInteger(0);public void increment() {count.incrementAndGet();   // 原子操作}public int getCount() {return count.get();}
}
2、可见性

(1)、概念
可见性是指当一个线程修改了共享内存中的某个变量的值,其他线程能够立即看到这个变量的新值。

在Java中,默认情况下,线程工作内存中保存了主内存中变量的副本。如果一个线程修改了一个变量的值,这个新值会首先保存到该线程的工作内存中,而不是立即写回主内存。因此,其他线程可能仍然看到的是这个变量的旧值,这就产生了可见性问题。

(2)、常用保证可见性的方法
1、volatile关键字
当一个变量被声明为volatile类型时,它会强制每次读取该变量时都会从主内存中读取最新的值,而不是使用线程缓存中的值;同时,每次写入该变量时也会立即将新的值写回到主内存中。这确保了所有线程都能看到最新的值。

2、synchronized关键字
通过使用synchronized关键字定义同步代码块或方法,可以确保同一时刻只有一个线程能够执行这段代码,从而避免了数据的不一致性问题。当一个线程退出同步代码块时,它对变量所做的任何更改都将被写回主内存,这样下一个进入同步代码块的线程看到的数据都是最新的值。

3、final关键字
对于被声明为final的字段,在构造函数中初始化后,其值就不能再改变。这意味着一旦对象构造完成,所有线程都可以安全地访问这些final字段,而无需额外的同步措施。

4、原子类
Java提供了诸如AtomicInteger等原子类,它们提供了原子操作的方法,可以在多线程环境中保证操作的原子性和可见性。

(3)、代码示例

public class VolatileVisibility {private volatile boolean flag = false;public void writer() {flag = true; // 修改flag,被volatile修饰,会立即写会主内存中}public void reader() {if (flag) {   // 读取flag,会从主内存加载值// 执行某些操作}}
}

在这个例子中,flag被声明为volatile,确保了writer方法中对flag的修改对reader方法是可见的。

3、有序性

(1)、概念
有序性是指程序的执行顺序按照代码的先后顺序执行。

在多线程环境中,编译器和处理器为了优化性能,可能会对指令进行重排序,但这不应该影响程序的最终结果。
有序性确保了程序的执行顺序符合开发者的预期,避免了因指令重排序导致的并发问题。

(2)、常用保证有序性的方法
1、volatile关键字
volatile变量的读写操作会产生内存屏障(Memory Barrier),确保在读取或写入volatile变量之前/之后的指令不会被重排序。

public class VolatileOrdering {private volatile boolean flag = false;private int data = 0;public void writer() {data = 42; // 写入dataflag = true; // 设置flag为true,内存屏障会保证data=42一行,一定会在之前执行}public void reader() {if (flag) { // 检查flagint localData = data; // 读取data// 使用localData}}
}

2、synchronized`关键字
通过锁的获取和释放操作,确保了指令的有序性。

3、java.util.concurrent.locks.Lock接口
同样通过锁的获取和释放操作,确保了指令的有序性。

(3)、有序性总结

如果在本线程内观察,所有的操作都是有序的;(单线程运行结果)
如果在一个线程中观察另一个线程,所有的操作都是无序的。(多线程运行结果,可能会不安全)
理解:
前半句是指“线程内似表现为串行的语义”(Within-Thread As-If-Serial Semantics),
在同一个线程内部,程序员看到的操作(例如读写变量)是按照代码中定义的顺序进行的。这意味着对于单个线程而言,它自己的所有操作看起来都是遵循程序中指定的顺序执行的。这是因为在单个线程中,CPU指令通常会按照源代码中编写的顺序来执行。
但是需要注意的是,这并不意味着底层硬件或编译器不会对指令进行重排序优化。实际上,为了提高性能,编译器和处理器可能会对指令进行重排序,只要这些改变不会影响到该线程内部的逻辑正确性。然而,从程序员的角度来看,这些操作仍然保持了“顺序一致性”,即它们表现得就像按照原始顺序执行一样。

后半句是指“指令重排序”现象和“工作内存与主内存同步延迟”现象。
在多线程环境中,每个线程都有自己的工作缓存,用来存储数据副本。当一个线程更新某个数据时,这个更新并不会立即反映到其他线程的工作缓存中,除非使用了合适的同步手段来确保内存可见性。因此,从一个线程的角度看另一个线程的操作,如果没有正确的同步,就可能出现操作看似“无序”的现象。

(5)、内存间的交互

1、lock(锁定)
作用于主内存的变量,把一个变量标识为一条线程独占的状态。(即:添加了指定线程的标记,只有这个线程可以用,其他线程就不能访问了)
2、unlock(解锁)
作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。(即:清除了标记,恢复了自由,谁在访问都可以)
3、read(读取)
作用于主内存的变量,把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。(即:去读主内存数据过程)
4、load(载入)
作用于工作内存的变量,把read操作从主内存中得到的变量值放入工作内存的变量副本中。(即:将读取主内存数据写入工作内存的过程)
5、use(使用)
作用于工作内存的变量,把工作内存中的一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作。(即:线程使用自己的变量副本)
6、assign(赋值)
作用于工作内存的变量,把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。(即:线程修改自己的变量副本的值)
7、store(存储)
作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write操作使用。(即:读取工作内存的副本值)
8、write(写入)
作用于主内存的变量,把store操作从工作内存中得到的变量值放入主内存的变量中。(即:将工作内存的副本值写入到主内存变量中)

(6)、指令重排

1、为什么要重排
计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。

2、有哪几种重排
(1)、编译器优化重排
编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
(2)、指令级的并行重排
现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
(3)、内存系统的重排
由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
在这里插入图片描述
注意:
单线程环境里面确保最终执行结果和代码顺序的结果一致。
处理器在进行重排序时,必须要考虑指令之间的数据依赖性。
多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。

3、重排代码示例

public class VolatileResort {static int num = 0;static boolean flag = false;public static void init() {num= 1;flag = true;}public static void add() {if (flag) {num = num + 5;System.out.println("num:" + num);}}public static void main(String[] args) {init();new Thread(() -> {add();},"子线程").start();}
}

如上代码,理论上排序应该是固定的,但是由于添加了if判断,因为存在多线程的缘故,看谁先抢到CPU资源,对这段代码的影响就是会造成add方法和init方法的先后执行顺序不确定,进而导致输出的结果不一致。

4、volatile怎么实现禁止指令重排?

原理:在volatile生成的指令序列前后插入内存屏障(Memory Barries)来禁止处理器重排序。内存屏障在之后会详细说明。

学海无涯苦作舟!!!

相关文章:

多线程篇-3--java内存模型(主内存,共享内存,三大特性,指定重排)

Java内存模型 Java Memory Model,简称JMM,本身是一种抽象的概念,实际上并不存在,它描述的是一组规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素&#xff0…...

Android Studio的AI工具插件使用介绍

Android Studio的AI工具插件使用介绍 一、前言 Android Studio 的 AI 工具插件具有诸多重要作用,以下是一些常见的方面: 代码生成与自动补全 代码优化与重构 代码解读 学习与知识获取 智能搜索与资源推荐实际使用中可以添加注释,解读某段代…...

【Yarn Bug】 yarn 安装依赖出现的网络连接问题

最近,在初始化 Ant Design Pro 前端脚手架过程中,使用 yarn 安装依赖时遇到了网络连接问题,具体错误信息提示为 info There appears to be trouble with your network connection. Retrying...。通过百度查询,得知出现这种问题的原…...

Vue3的Setup语法动态获取Dom或调用子组件方法

官方文档&#xff1a;https://cn.vuejs.org/api/composition-api-setup.html#composition-api-setup 获取Dom <template><div class"todo" ref"todoDom" click"handleClick"></div> </template><script lang"t…...

中科院一区算法KO-K均值优化算法(K-means Optimizer)-附Matlab免费代码

首先&#xff0c;使用K-means算法在每次迭代中建立聚类区域的形心向量&#xff0c;然后KO提出两种移动策略&#xff0c;以在开发和探索能力之间建立平衡。每次迭代中探索或开发的移动策略的决定取决于一个参数&#xff0c;该参数将被设计为识别每个搜索代理是否在访问的区域中过…...

python数据可视化销量柱状图练习

需求&#xff1a; 假设某店铺的商品销量分为 线上销量 和 线下销量&#xff1a; 使用 叠加柱状图 分别显示线上和线下销量。 在柱状图中添加每种商品的总销量。 图表美观&#xff0c;包含图例、网格、颜色区分等。 代码实现&#xff1a; import matplotlib.pyplot as plt imp…...

甘特图全面指南:原理、制作与实际案例

甘特图&#xff08;Gantt Chart&#xff09;是一种用于项目管理的直观工具&#xff0c;以条形图的形式展示任务的时间进度和依赖关系。它通过简单明了的视觉效果帮助团队跟踪任务进展&#xff0c;分配资源并优化时间安排。本文将深入介绍甘特图的定义、制作方法&#xff0c;以及…...

如何创建 MySQL 数据库的副本 ?

MySQL 是一个广泛使用的开源数据库系统&#xff0c;它提供了多种数据库复制的方法。此功能对于确保跨不同环境的数据可用性和完整性至关重要。 管理 MySQL 数据库通常需要创建数据库的副本。这个任务被称为 MySQL 数据库复制&#xff0c;对于备份、测试、服务器迁移和其他关键…...

基于YOLO模型的目标检测与识别实现在ESP32-S3 EYE上全流程部署

前言 文章首发于 基于YOLO模型的目标检测与识别实现在ESP32-S3 EYE上全流程部署 文章目录 前言项目环境安装ESP-IDF安装开发环境运行环境 训练数据集准备添加自定义数据集 下载预训练模型训练 YOLO 模型模型量化和格式转换模型结果评估训练损失评估指标模型推理 模型部署部署环…...

2411C++,CXImage简单使用

介绍 CxImage是一个可非常简单快速的加载,保存,显示和转换图像的C类. 文件格式和链接的C库 Cximage对象基本上是加了一些成员变量来保存有用信息的一个位图: class CxImage{...protected:void* pDib; //包含标题,调色板,像素BITMAPINFOHEADER head; //标准头文件CXIMAGEINFO…...

Java对象与XML互相转换(xstream)

依赖 <dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.18</version></dependency> 实体类 package com.itheima.util;import lombok.AllArgsConstructor; import lom…...

计算机视觉工程师紧张学习中!

在当今这个日新月异的科技时代&#xff0c;计算机视觉作为人工智能的重要分支&#xff0c;正以前所未有的速度改变着我们的生活和工作方式。为了紧跟时代步伐&#xff0c;提升自我技能&#xff0c;一群怀揣梦想与热情的计算机视觉设计开发工程师们聚集在了本次线下培训活动中。…...

网关整合sentinel无法读取nacos配置问题分析

sentinel无法读取nacos配置问题分析 1.spring-cloud-gateway整合sentinel2.问题现象3.原因猜测4.源码分析4. 结语 最近公司需要上线一个集约项目&#xff0c;虽然为内网项目&#xff0c;但曾经有过内网被攻破&#xff0c;导致内部系统被攻击的案例&#xff0c;且集约系统同时在…...

速盾:高防 CDN 中高级缓存有什么用?

在高防 CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;的服务体系里&#xff0c;高级缓存功能犹如一颗强大的 “性能优化引擎”&#xff0c;对于提升网站或应用的运行效率、减轻源站压力以及改善用户体验等诸多方面都发挥着极为关键的作用。 一…...

大数据期末笔记

第一章、大数据概述 人类的行为及产生的事件的一种记录称之为数据。 1、大数据时代的特征&#xff0c;并结合生活实例谈谈带来的影响。 &#xff08;一&#xff09;特征 1、Volume 规模性&#xff1a;数据量大。 2、Velocity高速性&#xff1a;处理速度快。数据的生成和响…...

Qt详解QUiLoader 动态加载UI文件

文章目录 详解 QUiLoader 模块的使用1. QUiLoader 简介1.1 应用场景 2. 准备工作2.1 添加模块依赖2.2 引入头文件 3. 使用 QUiLoader 加载界面3.1 示例代码form.uimain.cpp 4. 常用方法详解4.1 load函数原型作用参数返回值示例代码 4.2 createWidget函数原型作用参数返回值示例…...

Android -- 简易音乐播放器

Android – 简易音乐播放器 播放器功能&#xff1a;* 1. 播放模式&#xff1a;单曲、列表循环、列表随机&#xff1b;* 2. 后台播放&#xff08;单例模式&#xff09;&#xff1b;* 3. 多位置同步状态回调&#xff1b;处理模块&#xff1a;* 1. 提取文件信息&#xff1a;音频文…...

云平台与阿里云服务器使用

云平台 云就是一堆远程计算机组成的集群。 计算就是各种软件服务。 云平台就是远程计算机集群提供的的各种服务所组成的远程服务平台。 云平台提供的服务主要可以分为三个类别&#xff1a; I 服务 P服务 S服务 i就是基础设施服务infrastructure p就是平台服务platform …...

Dart 中 initializer lists

在 Dart 中&#xff0c;initializer lists 是构造函数的一种特性&#xff0c;允许你在进入构造函数体之前对某些字段进行初始化或进行检查。这些字段包括 final 字段&#xff0c;因为 final 字段必须在构造函数体运行之前被初始化。 以下是它的几个关键点和适用场景&#xff1…...

02.06、回文链表

02.06、[简单] 回文链表 1、题目描述 编写一个函数&#xff0c;检查输入的链表是否是回文的。 2、解题思路&#xff1a; 快慢指针找中点&#xff1a; 利用快慢指针的技巧来找到链表的中间节点。慢指针 slow 每次移动一步&#xff0c;而快指针 fast 每次移动两步。这样&…...

linux中限定特定用户使用crontab

在Linux中&#xff0c;crontab&#xff08;cron table&#xff09;是用来定时执行任务的工具。默认情况下&#xff0c;任何用户&#xff08;包括普通用户&#xff09;都可以为自己的账户创建和管理crontab条目&#xff0c;但前提是这个用户拥有对/var/spool/cron/crontabs目录的…...

Oracle Universal Unique Identifier (UUID)

本文介绍Oracle生成全局唯一ID的函数SYS_GUID&#xff0c;后续会对SYS_GUID和Sequence两种方法进行比较。 SYS_GUID 函数生成并返回一个由 16 个字节组成的全局唯一标识符&#xff08;RAW 值&#xff09;。在大多数平台上&#xff0c;生成的标识符由主机标识符、调用该函数的进…...

LangChain——加载知识库文本文档 PDF文档

文档加载 这涵盖了如何加载目录中的所有文档。 在底层&#xff0c;默认情况下使用 UnstructedLoader。需要安装依赖 pip install unstructuredpython导入方式 from langchain_community.document_loaders import DirectoryLoader我们可以使用 glob 参数来控制加载特定类型文…...

shell编程3,参数传递+算术运算

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…...

Spring boot之BeanDefinition介绍

在spring框架中IOC容器进行bean的创建和管理。Bean的创建是一个比较复杂的过程&#xff0c;它并不像我们创建对象一样只是直接new一下就行&#xff0c;虽然有些bean确实就是New一下。但在Spring中可以通过一些途径对bean进行增强扩展。在这个过程中&#xff0c;BeanDefinition作…...

JAVA:Spring Boot 3 实现 Gzip 压缩优化的技术指南

1、简述 随着 Web 应用的用户量和数据量增加&#xff0c;网络带宽和页面加载速度逐渐成为瓶颈。为了减少数据传输量&#xff0c;提高用户体验&#xff0c;我们可以使用 Gzip 压缩 HTTP 响应。本文将介绍如何在 Spring Boot 3 中实现 Gzip 压缩优化。 2、配置 Spring Boot 3 对…...

探索 IntelliJ IDEA 中 Spring Boot 运行配置

前言 IntelliJ IDEA 作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为 Spring Boot 应用提供了丰富的运行配置选项&#xff0c;定义了如何在 IntelliJ IDEA 中运行 Spring Boot 应用程序&#xff0c;当从主类文件运行应用程序时&#xff0c;IDE 将创建…...

Java学习,反射

Java反射是Java编程语言的一个重要特性&#xff0c;它允许程序在运行时查看任意对象所属的类&#xff0c;获取类的内部信息&#xff08;包括构造器、字段和方法等&#xff09;&#xff0c;并能动态地调用对象的方法或构造器。 反射概念 反射&#xff08;Reflection&#xff09…...

应急响应靶机——Windows挖矿事件

载入虚拟机&#xff0c;开启虚拟机&#xff1a; &#xff08;账户密码&#xff1a;administrator/zgsf123&#xff09; 发现登录进去就弹出终端界面&#xff0c;自动运行powshell命令&#xff0c;看来存在计划任务&#xff0c;自动下载了一些文件&#xff0c;之后就主动结束退…...

0017. shell命令--tac

目录 17. shell命令--tac 功能说明 语法格式 选项说明 实践操作 注意事项 17. shell命令--tac 功能说明 Linux 的 tac 命令用于按行反向输出文件内容&#xff0c;与 cat 命令的输出顺序相反。非常有趣&#xff0c;好记。也就是说&#xff0c;当我们使用tac命令查看文件内…...

富文本编辑器图片上传并回显

1.概述 在代码业务需求中&#xff0c;我们会经常涉及到文件上传的功能&#xff0c;通常来说&#xff0c;我们存储文件是不能直接存储到数 据库中的&#xff0c;而是以文件路径存储到数据库中&#xff1b;但是存储文件的路径到数据库中又会有一定的问题&#xff0c;就是 浏览…...

深入学习MapReduce:原理解析与基础实战

标题&#xff1a;深入学习MapReduce&#xff1a;原理解析与基础实战 MapReduce是一种分布式计算框架&#xff0c;用于大规模数据的处理和分析。作为Hadoop生态系统的核心组件&#xff0c;MapReduce凭借其简单的编程模型和强大的并行计算能力&#xff0c;广泛应用于大数据领域。…...

医院数据库优化:提升性能与响应时间的关键策略

一、引言 在当今数智化时代&#xff0c;医院信息系统不仅要追踪管理伴随人流、财流、物流所产生的管理信息&#xff0c;还应支持以病人医疗信息记录为中心的整个医疗、科学、科研活动&#xff0c;提高整个医院的运作效率。但随着信息化系统积累数据的增长&#xff0c;特别是病…...

OpenAI Whisper 语音识别 模型部署及接口封装

环境配置: 一、安装依赖&#xff1a; pip install -U openai-whisper 或者&#xff0c;以下命令会从这个存储库拉取并安装最新的提交&#xff0c;以及其Python依赖项&#xff1a; pip install githttps://github.com/openai/whisper.git 二、安装ffmpeg&#xff1a; cd …...

设计模式 外观模式 门面模式

结构性模式-外观模式 门面模式 适用场景&#xff1a;如果你需要一个指向复杂子系统的直接接口&#xff0c; 且该接口的功能有限&#xff0c; 则可以使用外观模式。 不用关心后面的查询具体操作 /*** 聚合查询接口*/ RestController RequestMapping("/search") Slf…...

AI智算-正式上架GPU资源监控概览 Grafana Dashboard

下载链接 https://grafana.com/grafana/dashboards/22424-ai-gpu-20241127/...

颜色分类

颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地 对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数…...

使用 pycharm 新建使用 conda 虚拟 python 环境的工程

1. conda 常见命令复习&#xff1a; conda env list // 查看 conda 环境列表 conda activate xxxenv // 进入指定 conda 环境2. 环境展示&#xff1a; 2.1. 我的物理环境的 Python 版本为 3.10.9&#xff1a; 2.2. 我的 conda 虚拟环境 env_yolov9_python_3_8 中的 pyth…...

图形渲染性能优化

variable rate shading conditional render 设置可见性等&#xff0c; 不需要重新build command buffer indirect draw glMultiDraw* - 直接支持多次绘制glMultiDrawIndirect - 间接多次绘制multithreading 多线程录制 实例化渲染 lod texture array 小对象剔除 投影到…...

14、保存与加载PyTorch训练的模型和超参数

文章目录 1. state_dict2. 模型保存3. check_point4. 详细保存5. Docker6. 机器学习常用库 1. state_dict nn.Module 类是所有神经网络构建的基类&#xff0c;即自己构建一个深度神经网络也是需要继承自nn.Module类才行&#xff0c;并且nn.Module中的state_dict包含神经网络中…...

简单获取json预览

data: JSON 数据。 collapsedNodeLength: 对象或数组的长度超过此阈值时会折叠 deep: json路径深度超过此值时会折叠 showLineNumber: 显示左侧行号 showIcon: 显示图标。 virtual: 使用虚拟滚动 height: 使用虚拟滚动时列表的高度 itemHeight: 使用虚拟滚动时节点的高…...

【C语言】连接陷阱探秘(5):头文件

目录 一、头文件的作用 1.1. 声明共享 1.2. 模块化 1.3. 实践中的注意事项 二、常见的头文件陷阱 2.1 重复包含(Include Guards) 2.1.1. Include Guard 工作原理 2.1.2. Pragma Once(某些编译器支持) 2.2 循环依赖(Circular Dependencies) 2.2.1. 前向声明 2.…...

burpsuite功能模块学习(2)

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势)

Vue 2.0-&#xff1e;3.0学习笔记&#xff08;Vue 3 &#xff08;四&#xff09;- Composition API 的优势&#xff09; Composition API 的优势1. Options API 存在的问题2. Composition API 的优势 Composition API 的优势 1. Options API 存在的问题 笔记 使用传统OptionsA…...

在 ASP.NET C# Web API 中实现 Serilog 以增强请求和响应的日志记录

介绍 日志记录是任何 Web 应用程序的关键方面。它有助于调试、性能监控和了解用户交互。在 ASP.NET C# 中&#xff0c;集成 Serilog 作为记录请求和响应&#xff08;包括传入和传出的数据&#xff09;的中间件可以显著提高 Web API 的可观察性和故障排除能力。 在过去的几周里&…...

MongoDB集群分片安装部署手册

文章目录 一、集群规划1.1 集群安装规划1.2 端口规划1.3 目录创建 二、mongodb安装&#xff08;三台均需要操作&#xff09;2.1 下载、解压2.2 配置环境变量 三、mongodb组件配置3.1 配置config server的副本集3.1.1 config配置文件3.1.2 config server启动3.1.3 初始化config …...

DimensionX 学习部署笔记

目录 依赖项: huggingface/DimensionX 是huggingface 下载后的目录; 报错处理参考网址: 测试代码 ok: 依赖项: pip install peft huggingface/DimensionX 是huggingface 下载后的目录; orbit_left_lora_weights.safetensors orbit_up_lora_weights.safetensors …...

设计模式:11、迭代器模式(游标)

目录 0、定义 1、迭代器模式的四种角色 2、迭代器模式的UML类图 3、示例代码 4、迭代器的next()方法与集合的get(int index)方法的效率对比&#xff08;LinkedList为例&#xff09; 0、定义 提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象…...

【CameraPoseRefinement】以BARF为例介绍三维重建中的位姿优化

文章目录 IntroductionApproachPlanar Image Alignment(2D)Neural Radiance Fields (3D)Bundle-Adjusting Neural Radiance Fields Experiment平面图像对齐的定性实验合成场景上的定量实验 Introduction 在计算机视觉三维重建中&#xff0c;求解3D场景的表示和定位给定的相机帧…...

大语言模型压缩技术;推理优化技术;SparseGPT算法;GPTQ算法

目录 大语言模型落地的成本、效率与效果 模型压缩技术 推理优化技术 SparseGPT算法 GPTQ算法 大语言模型落地的成本、效率与效果 模型压缩技术 模型压缩技术是大语言模型轻量化的关键。介绍了多种模型压缩方法,其中权重量化和模型稀疏化是两种主要的技术。 权重量化:权重…...