25 go语言(golang) - 内存分配机制原理
Go 语言的内存分配机制是一个复杂且高效的系统,旨在为程序提供快速和安全的内存管理。理解 Go 的内存分配有助于编写更高效的代码,并优化程序性能。
一、内存区域
-
栈(Stack)
- 栈用于函数调用时的临时变量分配。
- 栈上的内存在函数返回后自动释放,因此栈上的分配非常快速。
- Go 编译器会尽量将局部变量放在栈上,但如果变量需要在函数返回后继续存在,则会被提升到堆上。
- 每个 goroutine 都有自己的栈,初始大小较小(通常为几 KB),可以动态增长。
-
堆(Heap)
- 堆用于动态内存分配,生命周期由垃圾回收器管理。
- 在 Go 中,通过
new
或make
函数进行显式或隐式堆上对象创建。
示例代码:
package mainimport "fmt"func main() {stackTest()heapTest()
}func stackTest() {stackVar := 1123fmt.Println(stackVar)
}func heapTest() *int {heapVar := 1234fmt.Println(heapVar)return &heapVar
}
变量 stackVar
是一个局部变量,分配在栈上。当 stackTest
函数返回时,stackVar
的内存会自动释放。
当变量需要在函数返回后继续存在时,它们会被分配到堆上,所以变量 heapVar
需要在 heapTest
函数返回后继续存在,Go 编译器通过逃逸分析决定将 heapVar
分配到堆上。
二、内存管理
-
逃逸分析(Escape Analysis)
- 编译器通过逃逸分析决定变量应该放置在栈还是堆上。如果一个变量被认为“逃逸”出其作用域,它将被提升到堆中。
- 可以使用
go build -gcflags="-m"
来查看编译器的逃逸分析结果。
-
垃圾回收(Garbage Collection, GC)
- Go 使用并发标记-清除算法进行垃圾回收,以减少停顿时间和提高吞吐量。
- 垃圾回收自动处理不再使用的对象,从而避免手动释放资源导致的问题。
-
同步与并发支持
- Goroutine 是轻量级线程,由运行时调度器管理,通常共享同一地址空间以减少上下文切换开销。
2.1 逃逸分析
使用 go build -gcflags="-m"
分析上面代码的逃逸结果
➜ _43memory go build -gcflags="-m" test_main.go
# command-line-arguments
./test_main.go:13:13: inlining call to fmt.Println
./test_main.go:18:13: inlining call to fmt.Println
./test_main.go:13:13: ... argument does not escape
./test_main.go:13:14: stackVar escapes to heap
./test_main.go:17:2: moved to heap: heapVar
./test_main.go:18:13: ... argument does not escape
./test_main.go:18:14: heapVar escapes to heap
- Inlining call to fmt.Println: 这表明Go编译器尝试内联优化对
fmt.Println
的调用。内联是一种常见的优化技术,可以减少函数调用开销。 - … argument does not escape: 表示传入
fmt.Println()
的参数没有从该方法中逃逸出去。即使如此,由于可能性和潜在的持久引用问题,“不逃逸”并不意味着不会移动到堆上。 - stackVar escapes to heap: 尽管参数本身没有从打印方法中直接“逃脱”,但由于某种原因(如下所述),它仍然需要被移到堆上以确保正确性。
- moved to heap: heapVar: 明确指出由于返回其地址的需求,
heapVar
被移动到了堆空间。
为什么 stackVar
会逃逸?
stackVar
是一个局部变量,理论上应该在栈上分配。- 然而,在编译时发现
fmt.Println(stackVar)
可能需要该变量逃逸到堆上。原因是fmt.Println
可能会保留对其参数的引用(例如,在内部传递给其他函数或存储于全局变量中),导致stackVar
需要在函数返回后继续存在。
三、内存池化
sync.Pool
是 Go 语言标准库中的一个缓存池类型,它用于存储和复用临时对象,以减少内存分配和垃圾回收的压力。例如,在频繁创建和销毁大量小对象场景下,可以使用 sync.Pool
来提高性能。
sync.Pool
是一个并发安全的类型,可以在多个 goroutine 之间共享。
3.1 关键特性
-
自动垃圾回收:
sync.Pool
中存储的对象会在不再使用时被垃圾回收器自动清理。这意味着即使你忘记将对象放回池中,也不会导致内存泄漏。
-
并发安全:
sync.Pool
是线程安全的,可以在多个 goroutine 中同时使用,而无需额外同步机制。
-
生命周期管理:
- 对象从池中获取后,其生命周期由调用者管理。当调用者不再需要该对象时,应将其放回池中以供后续重用。
-
惰性初始化:
- 当从
sync.Pool
获取一个空闲对象时,如果没有可用实例,且定义了New()
函数,则会调用该函数创建一个新实例。
- 当从
-
GC 清理行为:
- 每次进行垃圾回收(GC)时,所有未被引用到外部变量或结构体字段中的 pool 对象都会被清除。这是为了避免长时间持有不必要的数据而导致内存浪费。
3.2 使用方法
type User struct {Id stringName string
}func Test1(t *testing.T) {// 创建一个对象池,并定义 New 函数pool := sync.Pool{New: func() interface{} {return User{Id: uuid.New().String(),Name: "A",}},}// 通过 Get() 方法获取对象obj := pool.Get().(User)fmt.Println(obj.Id, obj.Name)// 通过 Put() 方法放回对象pool.Put(obj)objNew := pool.Get().(User)fmt.Println(objNew.Id, objNew.Name)
}
输出
31c09d56-f851-4f08-a151-d340164ca5cb A
31c09d56-f851-4f08-a151-d340164ca5cb A
四、分配策略
4.1 Arena 和 Span
4.1.1 什么是 Span?
Span
是一组连续的页(page),这些页被作为一个整体来管理。是内存分配器用来管理堆上内存的一种基本单位。- 在 64 位系统上,一个页通常为 8KB,因此一个 span 可以由多个这样的页面组成。
Span
用于为特定大小类别的小对象提供内存空间。
4.1.2 什么是 Arena?
Arena
是一大片连续的虚拟地址空间,用来为堆上的对象提供基础设施支持。- 一个
Arena
包含多个Span
。 Arenas
提供了一个大的、可控范围,而Spans
则负责具体的小对象或特定大小类别对象的分配。
4.1.3 Span 分割策略
-
按大小类别划分:
- 内存分配器将对象划分为不同的大小类别(size class),每个 size class 对应一组 span。
- 小对象(通常小于 32KB)会被放置在预先定义好的 size class 中,以便快速查找和复用。
-
固定大小块:
- 每个 span 被进一步划分成固定大小的块,这些块用于实际对象的放置。
- 块的大小取决于它所属的 size class。例如,一个用于 16 字节对象的 span 会被划分成多个 16 字节的小块。
-
空闲与使用状态:
- 一个 span 可以处于多种状态:完全空闲、部分使用或完全使用。
- 当所有小块都被释放后,span 将返回到 mcentral 或 mheap,以供其他请求使用。
-
动态调整与合并:
- 如果某个 size class 的需求增加,Go 会从全局堆中获取新的页面,并创建更多相应类型的新 spans。
- 如果某些 spans 长时间未被使用,它们可能会合并回更大的可用空间,以减少碎片化并提高效率。
-
垃圾回收协作:
- 在垃圾回收过程中,会扫描所有活跃 spans 并标记其中仍然有效的数据;
- 回收无效数据所占据资源,并将其重新加入到 free list 中待后续利用;
4.2 三层架构
Go 语言的内存分配器采用了一个三层架构,包括 mcache
、mcentral
和 mheap
,以高效地管理内存分配和回收。这个架构旨在优化小对象的分配速度,并减少锁竞争,从而提高并发性能。
三层架构可以简单的抽象理解为三层缓存!
4.2.1 mcache
-
概念:
mcache
是每个 P(Processor,即 Go 的调度器中的逻辑处理器)私有的缓存,用于快速分配小对象。
-
作用:
- 提供线程本地化(Thread-local)的内存缓存,以减少全局锁争用,提高小对象分配效率。
-
工作机制:
- 每个 P 都有一个独立的
mcache
,用于缓存从mcentral
获取的小块内存(span)。 - 当 goroutine 请求一个小对象时,首先尝试从其所在 P 的
mcache
中获取。如果没有可用空间,则从mcentral
获取新的 span。
- 每个 P 都有一个独立的
4.2.2 mcentral
-
概念:
mcentral
是多个 P 共享的中央缓存,用于管理相同大小类的小块内存。
-
作用:
- 管理和组织不同大小类的小块内存,为各个 P 的
mcache
提供资源。
- 管理和组织不同大小类的小块内存,为各个 P 的
-
工作机制:
- 按照不同大小类别组织 span,每种大小类别都有对应的 free list。
- 当某个 P 的
mcache
缺少特定大小类别时,会向对应的mcentral
请求新的 span。
4.2.3 mheap
-
概念:
- 全局堆,是整个程序共享的一大片虚拟地址空间,用于大规模或长生命周期数据块请求来源地。
-
作用:
- 管理所有空闲的大型数据块和未使用页;
- 为上层提供基础设施支持;
-
工作机制
- 在需要大型数据块或者无法通过上两级满足请求情况下,直接与操作系统交互申请更多物理页;
- 将新申请到物理页划分成更细粒度单位并加入到相应 free list 中待后续使用;
4.2.4 内部运作流程
-
当一个 goroutine 发起一次小型对象请求时,它会首先检查当前所属 Processor 上是否存在足够容量可用自有资源池中;
-
如果找不到合适位置,则向中央资源池发起进一步请求以获取所需类型 Span;
-
若仍然无法满足需求则最终通过全局堆与底层操作系统进行直接交互来扩展整体虚拟地址空间范围;
4.3 小对象大对象
4.3.1 小对象
- 范围一般指大小在 16 字节到 32KB 之间的对象。
- 分配策略
- 小对象通过
mcache
和mcentral
来进行快速分配。 - 使用固定大小类别(size class)来组织这些小型数据块,每个 size class 对应一个特定大小的 span。
- 当请求一个小型数据块时,Go 会从相应 size class 的 span 中获取可用空间。
- 小对象通过
4.3.2 大对象
- 范围:指大小大于 32KB 的对象。
- 分配策略:
- 大对象直接从全局堆(mheap)中进行分配,而不是通过 mcache 或 mcentral。
- 因为大对象可能会跨越多个页面,因此需要专门处理以确保它们能够被高效地回收和重用。
- 由于可能并发访问,所以通常需要加锁获取。
相关文章:
25 go语言(golang) - 内存分配机制原理
Go 语言的内存分配机制是一个复杂且高效的系统,旨在为程序提供快速和安全的内存管理。理解 Go 的内存分配有助于编写更高效的代码,并优化程序性能。 一、内存区域 栈(Stack) 栈用于函数调用时的临时变量分配。栈上的内存在函数返…...
【Linux命令】ps -a 和 ps -ef 的区别
ps -a 和 ps -ef 是 ps(process status)命令的不同选项,它们用于显示不同的进程信息。以下是这两个选项的主要区别: ps -a -a 选项表示显示所有拥有终端的进程,但不包括守护进程(daemon processes&#x…...
几个支持用户名密码的代理链工具: glider, gost, proxychains+microsocks
几个支持用户名密码的代理链工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost:(https://github.com/ginuerzh/gost) 参考 https://www.quakemachinex.com/blog/279.html...
编译安装教程
编译教程 下面是一个完整的从源码编译安装软件的教程,涵盖了从环境准备到配置、编译、安装的所有可能会用到的步骤和细节,适用于各种类型的软件包。 一、环境准备 在开始编译源码之前,确保系统满足以下条件: 1. 安装必要工具 …...
计算机网络-物理层
1.1传输媒体: 导引型传输媒体:双绞线,同轴电缆,光纤 非导引型传输媒体:微波通信(2~40GHz) 1.2传输方式: 串行传输:一个接一个的依次传输 并行传输:一次发送n…...
缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布
近期,JuiceFS 企业版推出了 Cache Group Operator,用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具,它能够自动化应用程序的生命周期管理任务,使部署、扩展和运维更加高效。 在推出 Operator 之前…...
Linux应用软件编程-多任务处理(线程)
线程:轻量级的进程,线程的栈区独立(8M),与同一进程中的其他线程共用进程的堆区,数据区,文本区。 进程是操作系统资源分配的最小单位;线程是cpu任务调度的最小单位。 1. 线程的创建…...
MySql索引(基础篇)
后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 感谢各位大佬写的文章让我学到很多东西!只是在各位大佬的基础加了我自己的思路&a…...
手机发烫怎么解决?
在当今这个智能手机不离手的时代,手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感,长期过热还可能损害手机硬件、缩短电池寿命,甚至引发安全隐患。不过别担心,下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…...
Java实现观察者模式
一、前言 观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。 二、具体实现 …...
OpenResty开发环境搭建
简介 OpenResty 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。官方地址:http://openresty.org/cn/ 具备下列特点: 具备Nginx的完整功能基于Lua语言进行扩展&#…...
鸿蒙系统文件管理基础服务的设计背景和设计目标
有一定经验的开发者通常对文件管理相关的api应用或者底层逻辑都比较熟悉,但是关于文件管理服务的设计背景和设计目标可能了解得不那么清楚,本文旨在分享文件管理服务的设计背景及目标,方便广大开发者更好地理解鸿蒙系统文件管理服务。 1 鸿蒙…...
Elasticsearch-脚本查询
脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性…...
【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块
目录 一、脉冲模块 (1)资源介绍 🔅原理图 🔅采集原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…...
devops和ICCID简介
Devops DevOps(Development 和 Operations 的组合)是一种软件开发和 IT 运维的哲学,旨在促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它强调自动化流程,持续集成(CI…...
uniapp使用live-pusher实现模拟人脸识别效果
需求: 1、前端实现模拟用户人脸识别,识别成功后抓取视频流或认证的一张静态图给服务端。 2、服务端调用第三方活体认证接口,验证前端传递的人脸是否存在,把认证结果反馈给前端。 3、前端根据服务端返回的状态,显示在…...
OSI 网络 7 层模型
问: 请你介绍一下OSI七层网络模型物理层解决什么问题?功能原理问题 数据链路层解决什么问题功能原理 网络层解决的问题功能原理 传输层解决什么问题功能原理会话层解决什么问题功能原理: 表示层解决什么问题 应用层解决什么问题如何展示? 问: 请你介绍一下OSI七层网络模型 物…...
RK356x bsp 7 - PCF8563 RTC调试记录
文章目录 1、环境介绍2、目标3、PCF85634、dts配置5、内核配置6、测试验证 1、环境介绍 硬件:飞凌ok3568-c开发板 软件:原厂rk356x sdk 2、目标 开发板断电后仍正常计时。 3、PCF8563 PCF8563 是由 NXP Semiconductors 公司生产的低功耗 CMOS 实时…...
Vue.js组件开发-如何实现vueFLow流程
在Vue.js组件中实现vueFlow流程实例 确保已经安装了vueFlow库。如果还没有安装,可以使用npm或yarn进行安装: npm install braks/vue-flow # 或者 yarn add braks/vue-flow步骤: 引入vueFlow组件: 在Vue组件文件中ÿ…...
upload-labs关卡记录15
图片马,这里就可以看到任务和注意事项: 使用一个正常图片,然后拼接一个一句话木马即可实现。这里就用命令窗口进行实现: copy 111.png/b shell.php/a shell.png 注意这里的命令窗口要在存在图片和一句话木马的目录下打开&#…...
面试题总结
一、mysql中的乐观锁、悲观锁、共享锁、排它锁、行锁、表锁 1、乐观锁 通过sql实现的,更新sql语句时加上where version #{version}乐观锁不是数据库自带的锁,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认…...
Linux | 零基础Ubuntu解压RaR等压缩包文件
目录 介绍 案例分析 安装工具 解压实践 介绍 RAR是一种专利文件格式,用于数据压缩与归档打包,开发者为尤金罗谢尔(俄语:Евгений Лазаревич Рошал,拉丁转写:Yevgeny Lazarevich R…...
自动化测试-Pytest测试
目录 pytest简介 基本测试实例 编写测试文件 执行测试 pytest运行时参数 mark标记 Fixture pytest插件 Allure测试报告 测试步骤 pytest简介 Pytest是一个非常流行的Python测试框架,它支持简单的单元测试和复杂的功能测试,具有易于上手、功…...
磁盘调度算法
先来先服务(FCFS)算法 原理: 按照进程请求访问磁盘的先后顺序进行调度。就像是排队买东西,先到的先服务。 示例(Python): def fcfs(requests):"""requests是一个包含磁盘请求序…...
多视图 (Multi-view) 与多模态 (Multi-modal)
多视图 (Multi-view) 与多模态 (Multi-modal) 是两种不同的数据处理方式,它们在机器学习和数据分析中有着重要的应用。尽管这两者有一些相似之处,但它们关注的角度和处理方法有所不同。 多视图 (Multi-view) 定义:多视图指的是同一数据对象…...
CFA知识点梳理系列:CFA Level II, Reading 7 Economics of Regulation
这是CFA知识点梳理系列的第七篇文章,上一篇文章可以参考以下链接: CFA知识点梳理系列:CFA Level II, Reading 6 Economic Growth...
微信流量主挑战:三天25用户!功能未完善?(新纪元4)
🎉【小程序上线第三天!突破25用户大关!】🎉 嘿,大家好!今天是我们小程序上线的第三天,我们的用户量已经突破了25个!昨天还是16个,今天一觉醒来竟然有25个!这涨…...
1.微服务灰度发布落地实践(方案设计)
前言 微服务架构中的灰度发布(也称为金丝雀发布或渐进式发布)是一种在不影响现有用户的情况下,逐步将新版本的服务部署到生产环境的策略。通过灰度发布,你可以先将新版本的服务暴露给一小部分用户或特定的流量,观察其…...
Web3如何推动元宇宙的去中心化发展?
随着科技的不断进步,元宇宙的概念逐渐从科幻变成现实,它不仅是虚拟世界与现实世界的融合,更是数字交互和社会参与的新形态。在这个过程中,Web3作为下一代互联网的核心技术,正发挥着关键作用。特别是在去中心化的元宇宙…...
【NODE】01-fs和path常用知识点
前言 最近在使用express-generator知识进行搭建前后端通信,其中有些知识点涉及到nodejs的fs和path核心模块,因此另写一篇文章进行介绍和代码案例练习。 fs(文件系统)和 path 是 Node.js 的核心模块,用于文件操作和路径…...
矩阵线性方程组
矩阵可以是任何形状 当矩阵的行数等于列数,称之为方阵,那么它就有行列式 矩阵的公式 矩阵分块法 Matrix(母体) 克拉默法则 线性方程组 注意初等列变换不是一个同解变换 初等变换与秩 XAB 可以用初等列变换但是不推荐,还是使用初等行变换.用转置思想求解 ( X A ) T…...
Web API和Web Services的区分
前些年一提及自动化测试,大多是指UI界面层的自动化测试。近几年,随着分层自动化测试概念的兴起,以及自动化测试自身的发展与细分,自动化测试包含了更多的内容。 API(Application ProgrammingInterface,应用程序编程接…...
各种数据库类型介绍
在软件开发和数据处理领域,数据库扮演着至关重要的角色。它们用于存储、检索和管理大量数据,是信息系统不可或缺的基础。以下是几种常用的数据库类型及其简要介绍: 1.关系型数据库(Relational Databases) 关系型数据库…...
Hive练习题11-15
11、第11题 info 表 date result 2005-05-09 win 2005-05-09 lose 2005-05-09 lose 2005-05-09 lose 2005-05-10 win 2005-05-10 lose 2005-05-10 lose 如果要生成下列结果, 该如何写sql语句? win lose 2005-05-09 2 2 2005-05-10 1 2 答案: (1) …...
【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训
升级版1-清空全部的再次确认 实现功能: 历史搜索记录展示-历史搜索记录展示10条点击跳转-点击历史搜索记录可同步到搜索框并自动搜索全部删除-可一次性全部删除历史搜索记录全部删除-有再次确认操作展示 进行搜索后留下搜索记录 点击垃圾桶图标,显示【清空全部】 点击【清…...
学习笔记(C#基础书籍)-- C#高级应用
(12.25,12.26) I/O数据流技术:《第十二章》 为了能够长时间保存程序中的数据,I/O技术可以将数据保存到文件(如文本文件等)中。 ⭕文件基本操作 a.File类:支持对文件的基本操作&…...
pytorch将数据与模型都放到GPU上训练
默认是CPU,如果想要用GPU需要: 安装配置cuda,然后更新/下载支持gpu版本的pytorch,可以参考:https://blog.csdn.net/weixin_35757704/article/details/124315569设置device:device torch.device(cuda if t…...
华为 IPD,究竟有什么特点?(二)
关注作者 (四)华为版 IPD 特点四:一定要把差异化竞争力持 续建立在平台上 平台不仅带来研发效率的提升,更重要的是,它是技术竞争力的载体,是研发质 量的重要保证。 1)为什么很多企业摆脱不了同…...
CV(7)--神经网络训练
前言 仅记录学习过程,有问题欢迎讨论 什么是神经网络: 神经网络是一种模拟人脑神经元工作原理的算法,它由多个神经元组成,每个神经元都接受输入,通过计算产生输出,并将输出传递给其他神经元。神经网络的…...
git更改当前项目的远程仓库,保留原始仓库提交记录提交到新仓库
在开发过程中,有时需要将当前项目的远程仓库切换到另一个新的远程仓库,同时保留所有原始的提交记录。以下是详细的步骤和最佳实践,确保你能够顺利完成这一操作。 更改当前项目的远程仓库 1.查看当前的远程仓库 确认当前项目的远程仓库地址。…...
【产品应用】一体化无刷电机在旋转等离子喷枪中的应用
在现代工业制造与加工领域,等离子喷枪凭借其高温、高速的等离子射流,能够实现高效的材料表面处理、切割以及焊接等工艺,在众多行业中发挥着关键作用。而一体化无刷电机的应用,更是为等离子喷枪的性能提升和稳定运行注入了强大动力…...
docker django uwsgi 报错记录
这个配置中是能够正常进行网页访问的,能够查看网页 [uwsgi] chdir /home/luichun/lc/Pyfile/PyCursor/app module app.wsgi:application plugin-dir /usr/lib/uwsgi/plugins plugins python311 env TZAsia/Shanghai socket-timeout 60 websocket-ma…...
【自由能系列(初级),论文解读】神经网络中,熵代表系统的不确定性,自由能则引导系统向更低能量的状态演化,而动力学则描述了系统状态随时间的变化。
神经网络中的熵、自由能与动力学 核心结论: 神经网络在“学习”和“成长”过程中,熵、自由能以及动力学扮演着关键角色。 熵代表系统的不确定性,自由能则引导系统向更低能量的状态演化,而动力学则描述了系统状态随时间的变化。 这…...
云计算时代携程的网络架构变迁
大家觉得有意义和帮助记得及时关注和点赞!!! 前言0 携程云平台简介 网络演进时间线1 基于 VLAN 的二层网络 1.1 需求1.2 解决方案:OpenStack Provider Network 模型1.3 硬件网络拓扑1.4 宿主机内部网络拓扑1.5 小结 优点缺点2 基于 SDN 的大二层网络 2.1 面临的新问…...
uniapp 微信小程序 数据空白展示组件
效果图 html <template><view class"nodata"><view class""><image class"nodataimg":src"$publicfun.locaAndHttp()?localUrl:$publicfun.httpUrlImg(httUrl)"mode"aspectFit"></image>&l…...
java 线程池为什么设计成先进队列再创建最大线程为何先入队列再增加线程数?
java 线程池为什么设计成先进队列再创建最大线程为何先入队列再增加线程数? 这个设计与 线程池的性能优化 、资源利用和任务调度策略密切相关。要理解为什么线程池设计成“ 先将任务入队列,再创建最大线程数 ”,可以从以下几个方面进行分析&…...
我的Qt作品(20)使用Qt+OpenCV写一个旋转/抠图/mask生成工具
使用QtOpenCV写一个旋转/抠图/mask生成工具 1、旋转功能 void FormRotate::rotateImage(const cv::Mat &src, cv::Mat &dst, double degree) //旋转 {if (fabs(degree) < 0.001){dst src;return;}//center旋转的中心点坐标//degree旋转的角度,不是弧度,>0逆时针…...
【vue】vite + ts +vue3 安装及使用 pinia
vue3 TS 安装使用pinia状态管理_vue3 ts pinia-CSDN博客 Vue项目进阶:再谈Pinia函数式(composition API)用法-腾讯云开发者社区-腾讯云...
计算机网络 (10)网络层
前言 计算机网络中的网络层(Network Layer)是OSI(开放系统互连)模型中的第三层,也是TCP/IP模型中的第二层,它位于数据链路层和传输层之间。网络层的主要任务是负责数据包从源主机到目的主机的路径选择和数据…...
1085 PAT单位排行
每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。 输入格式: 输入第一行给出一个正整数 N(≤105),即考生人数。随后 N 行,每行按下列格式给出一个考生的信息ÿ…...