03垃圾回收篇(D4_彻底理解GC)
目录
一、浅析大促备战过程中出现的 fullGc,我们能做什么?
1. 什么是 JVM 的 GC?
2. 写代码的时候能做什么?
3. 测试能做啥
4. 知识小结
二、MinorGC、MajorGC、FullGC垃圾回收介绍
1. MinorGC (新生代垃圾回收)
2. Major GC(老年代垃圾回收)
3. Full GC (新生代+老年代垃圾回收)
一、浅析大促备战过程中出现的 fullGc,我们能做什么?
1. 什么是 JVM 的 GC?
JVM(Java Virtual Machine)
JVM 是 Java 程序的虚拟机,是一种实现 Java 语言的解释器。
它提供了一种独立于操作系统的运行环境,使得 Java 程序在任何支持 JVM 的计算机上都可以运
行。
JVM 负责加载、验证、解释、执行和垃圾回收 Java 字节代码,并为 Java 程序提供内存管理、线
程管理和安全控制等服务。
JVM 中的 GC(Garbage Collection)是垃圾回收的缩写,是 JVM 的内存管理机制。
Young GC 和 Full GC 是两种不同的 GC 算法。
Young GC:针对新生代对象的回收算法,通常使用的是复制算法或者标记整理算法。因为新生代
中的对象生命周期短,所以 Young GC 速度要比 Full GC 快得多。
Full GC:针对整个堆内存的回收算法,用于回收那些在 Young GC 中没有回收的存活对象。Full
GC 速度比较慢,因为它需要扫描整个堆内存,因此对系统的性能影响较大。
所以在设计 Java 应用时,需要尽量减少 Full GC 的次数,以保证系统的性能。
常见的方法包括扩大新生代的内存空间,减少数组长度等。
以上基本是通用的对 Jvm 和 Gc 的解释。
但是可以明显看出缺少一些细节,对我们来说还是没什么用,测试同学该如何理解具体的场景呢??
我们首先来理解 young GC 的诞生过程:
首先, 理解复制算法和标记整理算法,它们是两种不同的 Young GC 回收算法。
复制算法:将新生代内存分成两个等大的部分,新创建的对象存储在一个部分,而另一个部分用于
存储存活的对象。当新生代内存不够用时,Young GC 会发生,将存活的对象复制到另一个内存区
域。复制算法不会导致内存碎片,但是会消耗一定的内存空间。
标记整理算法:每次 Young GC 时,会先标记所有存活的对象,然后再将所有不存活的对象整理
到一起。因此,内存碎片可能会导致空间浪费。标记整理算法适用于需要保持内存空间整洁的应
用,比如那些需要长时间运行的服务器应用。
这个看看就好,本质上 Young Gc 可以理解成 jvm 正常的扫垃圾过程
根据上述的解释,相信聪明的小伙伴可以清晰的看到,young Gc 有着更高的回收效率,对业务侧
的影响要小的多~因此,我们进一步来看看头痛的 full Gc,是怎么来的?
Full GC 是 Full Garbage Collection 的缩写,是指把整个堆内存扫描一遍,回收不再使用的对象并
且整理内存的过程。
由于堆内存的整体回收过程非常慢,因此,Full GC 可能导致应用程序的暂停。
如上所述,只有更合理的内存分配,避免不被使用的对象频繁出现,调整堆内存的扫描时间。
full GC,即全垃圾回收,是一种垃圾回收的过程 , 它会暂停所有的应用程序线程,对整个堆进行
回收。 (这个太可怕了。。)
- 初始标记:首先,垃圾回收器标记出哪些对象是需要被回收的。
- 并发标记:然后,垃圾回收器将标记任务分配给多个线程,并发地执行标记任务。
- 重新标记:在并发标记的过程中,如果有新的对象被创建,需要对这些对象进行重新标记。
- 整理:接下来,垃圾回收器将没有被标记的对象整理到内存的一端。
- 回收:最后,垃圾回收器回收被标记的对象,释放内存。
来个图大家看的明白一些~ Full Gc 的生命流程~
本质上就是,垃圾太多,正常的活儿干不了了,内存空间不够了,得停下所有的事情,来一次大扫
除
2. 写代码的时候能做什么?
上述可得,fullGc 是很可怕的,由于堆内存的整体回收过程非常慢,因此,Full GC 可能导致应用
程序的暂停,直接就崩掉了。。。
要避免 Full GC 发生,本质上就需要对系统堆内存大小进行适当设置以及对代码进行优化,基本上
有以下这些 技巧:
- 调整堆内存大小:确定合适的堆内存大小是避免 Full GC 发生的关键。
- 对代码进行内存优化:使用不同的数据结构,避免内存泄漏,使用对象池等技巧。
- 使用较大的新生代:新生代是存储短生命周期对象的内存区域,更大的新生代可以减少 Full GC 的频率。
- 设置适当的垃圾回收算法:使用 G1 GC 算法等技术可以提高系统性能并减少 Full GC 的频率。
这些是避免 Full GC 发生的一些常见建议。请注意,每种情况都不同,所以要根据具体情况选择适
当的方法。这些方法,看起来还是很抽象...我们来说点具体例子
首先,堆内存大小和垃圾回收算法,不是咱能操作和关心的,业务侧也一般不怎么会调,交给运维
同学了。
浅提一下,调整内存大小:通过调整 JVM 参数,如 -Xms、-Xmx 来适当增大内存。
具体我们能做到的,最主要的就是减少数据对象的生命周期:
通过使用弱引用、软引用、虚引用等引用类型,可以在不需要数据对象时直接回收,从而避免 Full
GC 。
减少数据对象的生命周期是指在程序中使用对象时,尽可能地缩短对象的存活时间。
这样可以减少垃圾对象数量,降低 Full GC 的频率。
这是我们重点需要关注的!!
以下是一些具体的例子:
1. 避免使用不必要的临时对象:
如果程序中有大量临时对象,它们可能很快就会被垃圾回收器清理掉。因此,应该避免创建不必要
的临时对象,以减少对象的生命周期。
eg:
double average(double[] values) {
在这个例子中,数组 values 是临时对象,在函数结束时会被销毁。这样,不必考虑如何删除集
合,以避免内存泄漏的风险。
还有,
String concatenate(List<String> strings) {
在这个例子中,每次循环都会创建一个临时的字符串对象,并将其附加到 result 中。随着循环的进
行,这些临时对象可能会堆积,导致频繁的 GC 操作。为了避免这个问题,可以使用 Java 中的
StringBuilder 来构建字符串
String concatenate(List<String> strings) {
这样的话,不再需要创建临时字符串对象,从而减少 GC 的次数。
2. 尽早释放对象:当对象不再需要时,应该尽早将其释放,以便及时回收它。
例如,在程序完成处理后立即释放对象,而不是等到下一次需要使用它之前。
比如我们日常最常用的 for 循环就很棒,
for (int i = 0; i < data.length; i++) {
在这个例子中,循环变量 i 只在循环中使用,并在循环结束后释放。这样做可以减少不必要的内存
使用,从而减少全垃圾回收的次数。
另一个具体的例子是使用 try-with-resources 语句,这可以确保流等资源在不再使用后自动关闭,
例如:try (FileInputStream in = new FileInputStream("file.txt")) {
在这个例子中,文件输入流在不再使用后会被自动关闭,就不用手动关,这样也会更合理~
3. 重复使用对象:如果可以,可以尝试重复使用同一个对象,而不是频繁地创建和销毁新的对象。
这个比较好理解,比如同样的事务流程,没必要搞两个变量 ~ 最少的变量干最多的活儿是最理想
的~
4. 使用对象池:
可以使用对象池,重复使用固定数量的对象,而不是不断创建新的对象。这样可以减少对象的生命
周期,并降低Full GC 的频率。
使用对象池是一种常用的避免 Full GC 的方式。它的核心思想是重复利用已经创建好的对象,而不
是每次都创建新的对象。
以下是一个简单的对象池的代码例子:
import java.util.ArrayList;
在代码中,我们创建了一个大小为 100 的对象池,并在静态代码块中初始化了 100 个对象。当我
们需要使用对象时,可以调用 getObject 方法,如果对象池中有剩余的对象,就从对象池中取出一
个对象;如果没有剩余对象,就新建一个对象。当不需要这个对象了,就可以调用 returnObject 方
法,将对象放回对象池中。这样,我们可以重复利用已经创建好的对象,减少了对象的创建和销毁
的频率,从而减少了 Full GC 的几率。
5. 使用弱引用:
在程序中,如果有大量对象不会再使用,可以使用弱引用来引用它们。 这个最多应用在类型缓存
这样的场景,它们不是必须的对象,因此有些时候可以直接干掉这是一个弱引用的例子,这玩意儿
还是比较抽象的。。。
import java.lang.ref.WeakReference;
举个更具体点的:
import java.lang.ref.WeakReference;
这个例子中,我们将一个 MyObject 对象封装在弱引用中,并保存在 HashMap 缓存中,当我们显
式调用
System.gc()方法时,JVM 会尝试回收这些不再使用的对象,如果内存不足,则会回收 MyObject
对象,那么cache.get("example").get()返回的将是 null。
3. 测试能做啥
回顾全文,其实我们能做的真不多,只能在业务代码测试的过程中,
关注对象的使用频次,拒绝无效的引用或 new 一大堆没必要的对象。
具体手段:
定期监测 GC 日志:通过我们的 jvm 关注,大项目上线后,或代码改动特别大的项目上线后,
做一下读写压测的操作
数据结构优化: 根据上述的手段,测试开发工程师可以通过上述手段,来优化数据结构来减小数
据对象的生命周期,从而避免 Full GC。
在测试过程中,关注一下数据结构的合理性~
关注单元测试:通过运行研发的单元测试,或自己手动写一个,模拟实际的内存使用情况,来评估
内存的使用情况(基本上,目前的业务代码能跑起来,大概率是没问题的,,)
4. 知识小结
日常的业务代码测试,对内存的敏感度要高一些,没 bug 不一定不会出问题,现在我们的系统是
成熟的可靠的,但是面对大促的压力,如果能提前解决隐患,干掉有风险的内存使用,也是节省我
们压测时的工作量嘛
二、MinorGC、MajorGC、FullGC垃圾回收介绍
今天给大家继续分享MinorGC、MajorGC、FullGC相关知识,如有不对的地方欢迎指正!
1. MinorGC (新生代垃圾回收)
JDK1.8 堆内部结构
从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,也叫Young GC。因为
Java对象大多具备朝生夕死的特征,所以MinorGC非常频繁,一般回收速度也比较快。一般采用复
制算法。
说明:Minor GC可能会引发STW,暂停其他用户的线程,需要等JVM垃圾回收结束后,用户线程
才恢复运行。
Minor GC 触发条件
- Eden伊甸园区满了
- 新new的对象需要分配到新生代的Eden伊甸园区,当Eden区的空间不够的时候需要进行MinorGC策略回收,
2. Major GC(老年代垃圾回收)
Major GC指发生在老年代的GC。
Major GC触发条件
老年代空间不足时,会先尝试触发Minor GC。Minor GC之后空间还不足,则会触发Major GC。
说明:发生在老年代的GC ,基本上进行一次Major GC 就会伴随进行一次 Minor GC。
Major GC 的速度一般会比 Minor GC 慢 10 倍,并且STW的时间更长。
3. Full GC (新生代+老年代垃圾回收)
Full GC可以理解为Major GC+Minor GC组合后进行的一整个过程,是清理JVM整个堆空间
(年轻代和老年代空间)。
Full GC触发条件
- 调用System.gc()方法时,可通过-XX:+ DisableExplicitGC 参数来禁止调用System.gc()
- 当方法区空间不足时
- Minor GC后存活的对象大小超过了老年代剩余空间
- Minor GC时中Survivor幸存区空间不足时,判断是否允许担保失败,不允许则触发Full GC。允许,并且每次晋升到老年代的对象平均大小>老年代最大可用连续内存空间,也会触发Full GC
- CMS GC异常,CMS运行期间预留的内存无法满足程序需要,就会出现一次“Concurrent ModeFailure”失败,会触发Full GC
STW(Stop The World):垃圾回收发生过程中,会产生应用程序的停顿现象。停顿产生的时候
整个应用程序线程都会被暂停,有点应用程序像卡死的情况。
相关文章:
03垃圾回收篇(D4_彻底理解GC)
目录 一、浅析大促备战过程中出现的 fullGc,我们能做什么? 1. 什么是 JVM 的 GC? 2. 写代码的时候能做什么? 3. 测试能做啥 4. 知识小结 二、MinorGC、MajorGC、FullGC垃圾回收介绍 1. MinorGC (新生代垃圾回收)…...
C语言小项目——通讯录
功能介绍: 1.联系人信息:姓名年龄性别地址电话 2.通讯录中可以存放100个人的信息 3.功能: 1>增加联系人 2>删除指定联系人 3>查找指定联系人的信息 4>修改指定联系人的信息 5显示所有联系人的信息 6>排序(名字&…...
MyBatis和JPA区别详解
文章目录 MyBatis和JPA区别详解一、引言二、设计理念与使用方式1、MyBatis:半自动化的ORM框架1.1、代码示例 2、JPA:全自动的ORM框架2.1、代码示例 三、性能优化与适用场景1、MyBatis:灵活的SQL控制1.1、适用场景 2、JPA:开发效率…...
【理论】测试开发工程师进阶路线
一、腾讯与阿里的质量保证服务参考 阿里云效测试能力与架构 腾讯 WeTest 测试能力全景图 二、测试开发技术体系 1.用户端测试: Web/App 测试 Web/App 自动化测试 用户端专项测试 用户端安全测试 2.服务端测试: 接口协议与 Mock 接口自动化测试 服务端…...
能源新动向:智慧能源平台助力推动新型电力负荷管理系统建设
背景 国家能源局近日发布《关于支持电力领域新型经营主体创新发展的指导意见》,鼓励支持具备条件的工业企业、工业园区等开展智能微电网建设,通过聚合分布式光伏、分散式风电、新型储能、可调节负荷等资源,为电力系统提供灵活调节能力&#x…...
WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理
WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…...
CAP原则中的P:分区容错性(Partition tolerance)
CAP 理论概述 在分布式系统中,系统面临三大核心问题: 一致性(Consistency):所有节点的数据始终保持一致。可用性(Availability):系统始终能够响应请求,无论请求是否成功…...
校验收货地址是否超出配送范围实战3(day09)
优化用户下单功能,加入校验逻辑,如果用户的收货地址距离商家门店超出配送范围(配送范围为5公里内),则下单失败。 提示: 1. 基于百度地图开放平台实现(https://lbsyun.baidu.com/)…...
【二叉树的深搜】二叉树剪枝
文章目录 814. 二叉树剪枝解题思路:深度优先遍历 后序遍历另一种写法 814. 二叉树剪枝 814. 二叉树剪枝 给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点…...
Java 大视界 -- Java 大数据中的数据脱敏技术与合规实践(60)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
k8s优雅重启
理论上处于terminating状态的pod,k8s 就会把它从service中移除了,只用配置一个优雅停机时长就行了。kubectl get endpoints 验证 简介 使用kubernetes启动容器时,一般都会配置一些探针来保证pod的健康,并通过terminationGracePe…...
RK3568上电启动流程详解.2 [十五]
这里我们再深入分析一下 U-Boot 启动 Kernel 的过程。 我们首先需要从 eMMC 的 boot partition 中加载 kernel Image,kernel dtb 以及 Ramdisk: > mmc partPartition Map for MMC device 0 -- Partition Type: EFIPart Start LBA End L…...
仅仅4M!windows系统适用,免费无限制使用!
软件介绍 在日常生活里,我们经常会碰到电脑运行迟缓、网速卡顿的现象,却又不清楚是哪个程序在占用过多资源。这种时候,一款能实时监测网络和系统状态的工具就变得非常关键了。今天呢,就给大家介绍一个小巧又实用的监控工具——「T…...
SOME/IP服务接口
本系列文章将分享我在学习 SOME/IP 过程中积累的一些感悟,并结合 SOME/IP 的理论知识进行讲解。主要内容是对相关知识的梳理,并结合实际代码展示 SOME/IP 的使用,旨在自我复习并与大家交流。文中引用了一些例图,但由于未能找到原作…...
计算机网络之网络层
本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 03 网络层 在网上看到其他人做了相关笔记,就不再多余写了,直接参考着学习吧。 1 详解网络层-网络层概述和编址【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51CTO博客 2 …...
WebAssembly视频检测在社区创作平台的落地与实践 | 得物技术
一、背景&现状 创作者服务平台作为得物为社区创作者提供的PC端视频发布入口,地位非常重要。且随着功能的升级迭代,用户群体也越来越多。但我们偶尔会收到如下反馈: 视频损坏,无法播放视频模糊曝光度问题黑屏,只有…...
服务器内部是如何运行的
服务器内部的运行可以从硬件和软件两个方面来解释。 一、硬件层面 服务器的硬件与普通计算机相似,但它通常具有更高的性能和更强的扩展性。服务器硬件包括: 1.中央处理单元(CPU):负责执行服务器上的计算任务。服务器一般配备多核心的高性能CPU,以支持多个请求并行处理…...
mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用
全国地图json数据下载地址 目录 html加载全部代码 方式一:使用html方式加载geojson 1. 初始化地图 2. 加载geojson数据 设置geojson图层样式,设置type加载数据类型 设置线条 鼠标移入改变颜色,设置图层属性,此处是fill-extru…...
电子应用设计方案102:智能家庭AI鱼缸系统设计
智能家庭 AI 鱼缸系统设计 一、引言 智能家庭 AI 鱼缸系统旨在为鱼类提供一个健康、舒适的生活环境,同时为用户提供便捷的管理和观赏体验。 二、系统概述 1. 系统目标 - 自动维持水质稳定,包括水温、酸碱度、硬度和溶氧量等关键指标。 - 智能投食&…...
ESP8266 OTA固件启动日志里分区解析【2M flash】
ESP8266 启动日志中分区表的内容及其解释 分区表日志: I (136) boot: Partition Table: I (147) boot: ## Label Usage Type ST Offset Length I (170) boot: 0 nvs WiFi data 01 02 00009000 00004000 I (193) boot:…...
dl学习笔记:(7)完整神经网络流程
完整神经网络流程 反向传播链式求导 代码实现反向传播动量法Momentum开始迭代为什么选择小批量TensorDataset与DataLoader 反向传播 由于本节的公式比较多,所以如果哪里写错了漏写了,还请帮忙指出以便进行改正,谢谢。 在前面的章节已经介绍过…...
三分钟简单了解一些HTML的标签和语法_01
1.图片建议建立一个文件夹如下图所示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"keywords"><title>魔神羽落</title><style>.testone{background-color: #ff53e…...
C# 中使用Hash用于密码加密
通过一定的哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较短小的数据,这段小数据就是大数据的哈希值。他最大的特点就是唯一性,一旦大数据发生了变化,哪怕是一个微小的变化࿰…...
【C++高并发服务器WebServer】-2:exec函数簇、进程控制
本文目录 一、exec函数簇介绍二、exec函数簇 一、exec函数簇介绍 exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。 exec函数族的函数执行成功后不会返回&…...
Linux将目录挂载到另一个目录,类似软硬链接,并通过fstab实现
格式 <源> <目> none bind 0 0例如 /data/var/lib/docker /var/lib/docker none bind 0 0参数使用制表符tab间隔 效果 rootDebian12:~# cat /etc/fstab | grep -v ^# /dev/mapper/Debian12--vg-root / ext4 erro…...
【C++模板】:如何判断自定义类型是否实现某个函数
一、引子 偶尔我们会面对这样的尴尬的场景,我们需要显示的去判断在某个自定义类型中,是否已经提供了我们期待的API接口,以避免产生“莫须有”的错误。阁下该如何破解此问题! 这里,直接给出一种通用的方法,…...
关于CAN(FD)转以太网详细介绍
一、功能描述 CANFD 完全向下兼容 CAN ,以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…...
GPU算力平台|在GPU算力平台部署MedicalGPT医疗大模型的应用教程
文章目录 一、GPU算力服务平台云端GPU算力平台 二、平台账号注册流程MedicalGPT医疗大模型的部署MedicalGPT医疗大模型概述MedicalGPT部署步骤 一、GPU算力服务平台 云端GPU算力平台 云端GPU算力平台专为GPU加速计算设计,是一个高性能计算中心,广泛应用…...
【ChatGPT】意义空间与语义运动定律 —— AI 世界的神秘法则
作者介绍 斯蒂芬•沃尔弗拉姆(Stephen Wolfram) 计算机科学家、数学家和理论物理学家,当今科学和技术领域重要的革新者之一。他创造了在全世界备受推崇的软件系统——Mathematica、Wolfram|Alpha和Wolfram语言。 在 ChatGPT 内部,…...
Harbor 部署教程
Harbor 部署教程 一.背景二.遇到的问题及解决办法1.服务无法启动,相关的容器不断重启 三.操作步骤1. 创建工作目录并进入2. 配置 Docker 守护进程3. 重启 Docker 服务4. 下载 Harbor 离线安装包和 Docker Compose5. 安装 Docker Compose6. 解压 Harbor 安装包7. 配置 Harbor8. …...
hive 自动检测、自动重启、记录检测日志、自动清理日志
最终效果 定时检测hive运行状态,进程不存在或者进程存在但是不监听端口的hiveserver2,自动重新拉起每次检测脚本执行的日志都会保存在log目录下.check文件,每一个月一个文件每月15日,删除2月前的检测日志开启hive自带日志输出后&…...
C++类和对象下详细指南
C类和对象下详细指南 1. 初始化列表与构造函数 1.1 初始化列表概述 初始化列表在C中用于初始化对象的成员变量,特别是当你需要在对象构造时就明确成员变量的值时。通过初始化列表,成员变量的初始化可以在进入构造函数体之前完成。这不仅可以提升性能&…...
【算法C++】构造回文字符串问题
问题描述 小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t,并且这个字符串需要满足以下几个条件: t 由小写字母组成,且长度与 s 相同。t 是回文字符串,即从左到右与从右到左读取相同。t 的字典序要小于 s&…...
基于java线程池和EasyExcel实现数据异步导入
基于java线程池和EasyExcel实现数据异步导入 2.代码实现 2.1 controller层 PostMapping("import")public void importExcel(MultipartFile file) throws IOException {importService.importExcelAsync(file);}2.2 service层 Resource private SalariesListener sa…...
使用Layout三行布局(SemiDesign)
tips:Semi Design网址 :Semi Design 1、安装Semi # 使用 npm npm i douyinfe/semi-ui# 使用 yarn yarn add douyinfe/semi-ui# 使用 pnpm pnpm add douyinfe/semi-ui 2、引入Layout布局 import { Layout } from douyinfe/semi-ui;3、开始实现三行布局…...
缓存之美:万文详解 Caffeine 实现原理(下)
上篇文章:缓存之美:万文详解 Caffeine 实现原理(上) getIfPresent 现在我们对 put 方法有了基本了解,现在我们继续深入 getIfPresent 方法: public class TestReadSourceCode {Testpublic void doRead() …...
PHP防伪溯源一体化管理系统小程序
🔍 防伪溯源一体化管理系统,品质之光,根源之锁 🚀 引领防伪技术革命,重塑品牌信任基石 我们自豪地站在防伪技术的前沿,为您呈现基于ThinkPHP和Uniapp精心锻造的多平台(微信小程序、H5网页&…...
STM32——LCD
一、引脚配置 查看引脚 将上述引脚都设置为GPIO_Output 二、导入驱动文件 将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。 当然,后面 lcd 的驱动学习可以和 IMX6U 一块学。 三、LCD函数 void LCD_Clear(u16 Color); 功能…...
洛谷刷题1-3
比较巧妙,求最小公倍数,看多少个数一次循环,直接求解就好了,N的数量级比较大,一层循环也会超时,也用了点双指针的想法(归并排序) 这里很大的问题,主要是cin输入的时候遇到…...
Facebook 元宇宙与全球文化交流的新趋势
随着科技的快速发展,虚拟现实与增强现实技术逐渐成为全球社交平台的重要组成部分。Facebook(现改名为 Meta)率先将目光投向了元宇宙这一新兴领域,致力于打造一个超越传统社交媒体的虚拟空间,成为全球文化交流的新平台。…...
结构化布线系统分为六个子系统
文章目录 前言系统介绍1. 工作区子系统 (Work Area Subsystem)2. 水平布线子系统 (Horizontal Cabling Subsystem)3. 管理子系统 (Administration Subsystem)4. 干线(垂直)子系统 (Backbone Cabling Subsystem)5. 设备间子系统 (Equipment Room Subsyste…...
亿坊软件前端命名规范
在前端开发中,文件命名的重要性不言而喻。由于历史原因和个人习惯,不同的开发者在命名DOM结构、图片和CSS文件时,可能会产生不一致的情况。这不仅会导致维护成本增加,还会降低团队协作效率。因此,制定一套统一的命名规…...
单片机-STM32 IIC通信(OLED屏幕)(十一)
一、屏幕的分类 1、LED屏幕: 由无数个发光的LED灯珠按照一定的顺序排列而成,当需要显示内容的时候,点亮相关的LED灯即可,市场占有率很高,主要是用于户外,广告屏幕,成本低。 LED屏是一种用发光…...
【Qt】: QPointer详解
考古: 《Qt智能指针之QScopedPointer》 QPointer是Qt框架中的一个智能指针类,用于安全地管理QObject派生对象的指针。它的主要功能是自动将指针置为nullptr,当它所指向的QObject对象被销毁时。这在Qt应用程序中非常有用,因为QObj…...
15_业务系统基类
创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…...
C++中explicit关键字的介绍和使用详解
某一天突然发现Qt自动生成的类文件的构造函数前边都有explicit关键字,但是explicit关键字什么意思呐? 在C中,explicit是一个关键字,主要用于修饰构造函数或转换运算符,其作用是防止隐式类型转换或隐式构造行为。 下面…...
动态内存管理
本章重点 1.为什么存在动态内存分配 2.动态内存函数的介绍 3.malloc free calloc realloc 4.常见的动态内存错误 一.为什么存在动态内存分配 二.动态内存函数的介绍 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include &…...
Java 中的各种锁详解
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
进制之间转换
「 一、十进制 二进制 」 1.十进制转二进制:一直除以2直到商为0,再反向取余数。 例:13(十进制)转1101(二进制) 2.二进制转十进制:最后一位数开始是2^0,然后一直按照指数递增的方式…...
微信小程序获取位置服务
wx.getLocation({type: gcj02,success(res) {wx.log(定位成功);},fail(err) {wx.log(定位失败, err);wx.showModal({content: 请打开手机和小程序中的定位服务,success: (modRes) > {if (modRes.confirm) {wx.openSetting({success(setRes) {if (setRes.authSetting[scope.u…...