JavaScript性能优化实战(3):内存管理与泄漏防范
JavaScript内存模型与垃圾回收机制解析
JavaScript作为一种高级编程语言,其内存管理过程对开发者而言大部分是透明的,但了解其内存模型和垃圾回收机制对于编写高性能应用至关重要。
JavaScript的内存分配与管理
JavaScript引擎在执行代码时会自动为变量和对象分配内存,主要分为以下几种类型:
-
栈内存(Stack):存储基本数据类型(如Boolean、Number、String、Null、Undefined、Symbol、BigInt)和对象引用地址
- 特点:固定大小,操作速度快,先进后出
- 生命周期:随函数调用结束自动释放
-
堆内存(Heap):存储引用类型数据(如Object、Array、Function等)
- 特点:动态分配,大小不固定
- 生命周期:由垃圾回收器决定
// 基本类型存储在栈内存中
let a = 10;
let b = 'hello';// 引用类型存储在堆内存中,变量存储的是引用地址
let obj = { name: '张三', age: 25 };
let arr = [1, 2, 3, 4];
垃圾回收算法
JavaScript引擎使用两种主要的垃圾回收算法:
1. 引用计数(Reference Counting)
最简单的垃圾回收算法,原理是跟踪记录每个值被引用的次数:
- 当引用次数为0时,该内存被回收
- 存在循环引用问题,可能导致内存泄漏
// 创建对象,引用计数为1
let user = { name: '李四' };// 引用计数变为0,对象可被回收
user = null;// 循环引用问题示例
function createCycle() {let obj1 = {};let obj2 = {};// 相互引用obj1.ref = obj2;obj2.ref = obj1;// 即使将变量设为null,对象仍然相互引用,不会被回收obj1 = null;obj2 = null;
}
2. 标记-清除(Mark and Sweep)
现代JavaScript引擎主要采用的算法,分为两个阶段:
- 标记阶段:从根对象(全局对象、当前执行上下文中的变量)开始,标记所有可达对象
- 清除阶段:清除所有未被标记的对象
这种算法能有效解决循环引用问题,但仍有内存碎片化的缺点。
V8引擎的内存管理特点
V8引擎(Chrome和Node.js使用的JavaScript引擎)采用了分代式垃圾回收:
-
新生代(Young Generation):
- 存储生命周期短的对象
- 使用Scavenge算法(复制算法的变种)
- 内存空间小,垃圾回收频繁且速度快
-
老生代(Old Generation):
- 存储生命周期长的对象
- 使用标记-清除和标记-整理算法
- 内存空间大,垃圾回收不频繁但较慢
V8内存限制:
- 32位系统:约800MB
- 64位系统:约1.4GB
这种设计使V8在处理网页脚本等小型应用时非常高效,但在处理大数据量时可能需要特别注意内存使用。
垃圾回收对性能的影响
垃圾回收是一个计算密集型过程,可能导致JavaScript执行暂停(GC暂停),影响用户体验:
- 主垃圾回收(Major GC):处理整个堆内存,暂停时间长
- 小垃圾回收(Minor GC):仅处理新生代,暂停时间短
现代JavaScript引擎采用了多种策略减少GC对性能的影响:
- 增量标记:将标记工作分散到多个时间片中
- 并发标记:在后台线程中执行部分GC工作
- 懒清理:延迟清理未使用的内存
闭包与作用域链对性能的影响
闭包是JavaScript中一个强大而独特的特性,但使用不当会对性能和内存使用产生重大影响。
闭包的内存行为解析
闭包是指内部函数可以访问其外部函数作用域中变量的能力。当创建闭包时,JavaScript会保留外部函数的变量,即使外部函数已经执行完毕。
function createCounter() {let count = 0; // 这个变量被闭包引用,不会被垃圾回收return function() {count++; // 访问外部函数的变量return count;};
}const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
在上面的例子中,createCounter
函数执行后,返回了一个内部函数。由于内部函数引用了外部函数的count
变量,JavaScript引擎会将count
变量保存在内存中,而不是随createCounter
函数执行完毕后释放。
作用域链与性能开销
JavaScript的作用域链决定了变量查找的顺序:先在当前作用域查找,若未找到则向外层作用域继续查找,直至全局作用域。
作用域链对性能的影响主要表现在:
- 变量查找的时间开销:作用域链越长,变量查找所需时间越多
- 内存占用:作用域链上的所有变量都会被保留在内存中
// 低效作用域链示例
function inefficientFunction() {const outerVar = 'outer';function innerFunction() {for (let i = 0; i < 10000; i++) {// 每次循环都要查找作用域链上的outerVarconsole.log(i, outerVar);}}innerFunction();
}// 优化版本
function efficientFunction() {const outerVar = 'outer';function innerFunction(localVar) {for (let i = 0; i < 10000; i++) {// 使用局部参数,避免沿作用域链查找console.log(i, localVar);}}innerFunction(outerVar);
}
闭包导致的内存泄漏
不恰当的闭包使用容易导致内存泄漏,主要有以下几种情况:
- 长期持有不必要的引用
// 内存泄漏示例
function leakyFunction() {const largeData = new Array(1000000).fill('x');return function processSomeData() {// 这个函数可能只用到largeData的一小部分// 但会导致整个largeData数组都留在内存中return largeData[0];};
}const processData = leakyFunction(); // largeData会一直存在于内存中
- 循环引用与闭包结合
function setupEventHandlers() {const element = document.getElementById('button');const data = { counter: 0, largeData: new Array(1000000) };element.addEventListener('click', function() {// 闭包引用了外部的data对象data.counter++;console.log('Counter:', data.counter);});// 即使setupEventHandlers函数执行完毕,// 由于事件处理函数形成闭包引用了data,data对象不会被回收
}
闭包优化最佳实践
- 最小化闭包作用域
// 不良实践
function badClosure() {const a = 1;const b = 2;const hugeObject = new Array(10000).fill('data');return function() {return a + b; // 只使用a和b,但hugeObject也会被保留};
}// 良好实践
function goodClosure() {const a = 1;const b = 2;const result = a + b;const hugeObject = new Array(10000).fill('data');// hugeObject在这里被使用后可以被回收return function() {return result; // 只保留需要的数据};
}
- 避免不必要的闭包
// 低效方式
for (let i = 0; i < 1000; i++) {const button = document.createElement('button');button.innerText = 'Button ' + i;// 为每个按钮创建一个闭包button.onclick = function() {console.log('Button ' + i + ' clicked');};document.body.appendChild(button);
}// 优化方式:使用事件委托
const container = document.createElement('div');
for (let i = 0; i < 1000; i++) {const button = document.createElement('button');button.innerText = 'Button ' + i;button.setAttribute('data-index', i);container.appendChild(button);
}// 只创建一个事件处理函数
container.addEventListener('click', function(event) {if (event.target.tagName === 'BUTTON') {const index = event.target.getAttribute('data-index');console.log('Button ' + index + ' clicked');}
});document.body.appendChild(container);
- 及时解除引用
function processData() {let largeObject = new Array(1000000).fill('data');// 使用完大对象后立即解除引用const result = doSomethingWith(largeObject);largeObject = null; // 允许垃圾回收器回收大对象return result;
}
性能对比实验
在一个包含10,000个DOM元素的页面上,比较了优化和未优化的闭包使用:
场景 | 内存占用 | 事件响应时间 |
---|---|---|
每个元素一个闭包 | 约85MB | 平均35ms |
使用事件委托 | 约12MB | 平均8ms |
通过正确管理闭包和作用域链,在本例中减少了85%的内存使用,并显著提升了事件响应速度。
内存泄漏识别与Chrome Memory工具使用
内存泄漏是前端应用中常见的性能问题,会导致应用随着时间推移变得越来越慢,甚至最终崩溃。及时识别和修复内存泄漏对于保持应用的稳定性和性能至关重要。
常见的JavaScript内存泄漏模式
1. 全局变量滥用
全局变量是最常见的内存泄漏来源之一。在JavaScript中,意外创建的全局变量会一直存在直到页面关闭。
function setData() {// 未使用var/let/const声明,意外创建全局变量leakyData = new Array(10000000);
}function createGlobalCallback() {// 全局回调函数引用了可能很大的数据window.globalCallback = function() {// 引用外部变量console.log(leakyData);};
}
2. 被遗忘的定时器和回调函数
未清除的定时器和事件监听器是另一个常见的内存泄漏来源。
function startInterval() {let largeData = new Array(1000000).fill('x');// 启动一个永不停止的定时器setInterval(function() {// 引用了largeData,导致它无法被回收console.log(largeData[0]);}, 5000);
}// 页面加载时调用
startInterval();// 然后即使切换页面,定时器和数据仍然存在于内存中
3. DOM引用未释放
即使从DOM树中移除了元素,如果JavaScript代码仍持有对该元素的引用,元素及其所有子元素占用的内存将无法被回收。
let elements = {button: document.getElementById('button'),image: document.getElementById('image'),text: document.getElementById('text')
};function removeButton() {// 从DOM树移除buttondocument.body.removeChild(document.getElementById('button'));// 但elements.button仍然引用着这个DOM节点// button元素仍存在于内存中
}
4. 闭包中的循环引用
如前一节所述,闭包结合循环引用是内存泄漏的常见原因。
使用Chrome DevTools检测内存泄漏
Chrome DevTools提供了强大的内存分析工具,可以帮助开发者识别和修复内存泄漏问题。
1. 内存面板概览
Chrome DevTools的Memory面板提供了三种主要的内存分析工具:
- 堆快照(Heap Snapshot):显示页面JavaScript对象和DOM节点的内存分布
- 分配时间轴(Allocation Timeline):随时间记录内存分配情况
- 分配采样(Allocation Sampling):以较低的性能开销采样内存分配
相关文章:
JavaScript性能优化实战(3):内存管理与泄漏防范
JavaScript内存模型与垃圾回收机制解析 JavaScript作为一种高级编程语言,其内存管理过程对开发者而言大部分是透明的,但了解其内存模型和垃圾回收机制对于编写高性能应用至关重要。 JavaScript的内存分配与管理 JavaScript引擎在执行代码时会自动为变量和对象分配内存,主…...
基于自主大型语言模型代理的AIoT智能家居
中文标题:基于自主大型语言模型代理的AIoT智能家居 英文标题:AIoT Smart Home via Autonomous LLM Agents 作者信息 Dmitriy Rivkin, Francois Hogan, Amal Feriani, Abhisek Konar, Adam Sigal, Xue Liu, Gregory Dudek 论文出处 《IEEE Internet o…...
Maven 手动添加 JAR 包到本地仓库笔记
Maven 手动添加 JAR 包到本地仓库笔记 背景 Maven 默认从中央仓库(repo1.maven.org)自动下载依赖,但在以下场景中可能遇到问题: 网络限制: 国内访问 Maven 中央仓库速度较慢(尤其未配置镜像时)…...
CS 系列 USB3.0 工业面阵相机不同快门类型的作用及其区别
关于 CS 系列 USB3.0 工业面阵相机 中不同快门类型的作用及其区别的详细分析: 1. 快门类型概述 工业面阵相机的快门类型主要分为 机械快门、电子快门(包括全局快门和滚动快门)和 电子前帘快门,但机械快门在工业相机中较少见&…...
【官方正版,永久免费】Adobe Camera Raw 17.2 win/Mac版本 配合Adobe22-25系列软
Adobe Camera Raw 2025 年 2 月版(版本 17.2)。目前为止最新版新版已经更新2个月了,我看论坛之前分享的还是2024版,遂将新版分享给各位。 Adobe Camera Raw,支持Photoshop,lightroom等Adobe系列软件&#…...
怎么减少tcp 的time_wait时间
减少 TCP 连接的 TIME_WAIT 状态时间是运维中常见的优化问题,尤其是在高并发和大量短连接的场景下,过多的 TIME_WAIT 会占用系统资源,影响系统性能。下面是一些常见的优化方法和措施。 🔹 1. 修改 TCP 参数 ✅ 调整 tcp_fin_time…...
RK3568平台开发系列讲解(调试篇)debugfs API接口及案例
更多内容可以加入Linux系统知识库套餐(教程+视频+答疑) 🚀返回专栏总目录 文章目录 一、Debugfs API1.1、创建目录和文件1.2、导出数字1.3、绑定一个 size_t 类型的变量1.4、绑定一个 u32 类型的变量1.5、绑定一块二进制数据1.6、绑定到一堆寄存器集合1.7、修改 debugfs…...
文件【Linux操作系统】
文章目录 文件前置知识访问文件之前,为什么文件必须打开?文件的管理 标准流标准错误流的作用是什么? 进程和文件的关系在用户层面文件描述符是访问文件的唯一方式,因为系统调用接口只能通过文件描述符来找到对应的文件 操作文件的…...
PVT曲线:预测高分子材料收缩与翘曲的“热力学密码”
在高分子材料的广阔领域中,PVT 曲线作为一种关键的研究工具,正逐渐展现出其不可忽视的重要性。PVT 曲线,即聚合物材料的压力(Pressure)、体积(Volume)和温度(Temperature)…...
IDEA中Quarkus框架(3.13版本)容器编排、压测与调优、注意事项等
Quarkus框架学习的第一部分,请访问: IDEA中Quarkus框架(3.13版本)开发、调试、部署、打包等 五、docker-compose容器编排 1、创建编排文件 cd quarkus-helloworldvi docker-compose.ymldocker-compose.yml内容如下: # yaml 配置实例 ver…...
vue+django+LSTM微博舆情分析系统 | 深度学习 | 食品安全分析
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号: D031 LSTM 架构:vuedjangoLSTMMySQL 功能: 微博信息爬取、情感分析、基于负面消极内容舆情分析…...
CSS初识
CSS能够对⽹⻚中元素位置的排版进⾏像素级精确控制,实现美化⻚⾯的效果.能够做到⻚⾯的样式和结构分离。 可以理解给页面化妆,美化排版。 基本语法规范 选择器{⼀条/N条声明} 选择器决定针对谁修改(找谁) 声明决定修改啥(⼲啥) 声明的属性是键值对,…...
Kafka 主题设计与数据接入机制
一、前言:万物皆流,Kafka 是入口 在构建实时数仓时,Kafka 既是 数据流动的起点,也是后续流处理系统(如 Flink)赖以为生的数据源。 但“消息进来了” ≠ “你就能处理好了”——不合理的 Topic 设计、接入方…...
文件系统常见函数
write系统调用 #include <unistd.h> ssize_t write(int fd, const void *buf, size_t count); 参数说明 fd 文件描述符,指向已打开的文件或设备(如标准输出 1、文件句柄等 buf 指向待写入数据的缓冲区指针,支持任意数据类型…...
深入理解 G1 GC:已记忆集合(RSet)与收集集合(CSet)详解
已记忆集合(RSet)与收集集合(CSet)详解 深入理解 G1 GC:已记忆集合(RSet)与收集集合(CSet)详解一、 引言:G1 GC 的基石二、 已记忆集合 (RSet):跟…...
Android Cordova 开发 - Cordova 解读初始化项目(index.html meta、Cordova.js、config.xml)
一、index.html meta 1、Content-Security-Policy (1)基本介绍 <meta http-equiv"Content-Security-Policy" content"default-src self data: https://ssl.gstatic.com unsafe-eval; style-src self unsafe-inline; media-src *; i…...
uv run 都做了什么?
uv run 都做了什么? uv run <命令> [参数...] 的主要作用是:在一个由 uv 管理或发现的 Python 虚拟环境中,执行你指定的 <命令>。它会临时配置一个子进程的环境,使其表现得如同该虚拟环境已经被激活一样。这意味着&am…...
Maven 依赖坐标与BOM统一管理
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
UV: Python包和项目管理器(从入门到不放弃教程)
目录 UV: Python包和项目管理器(从入门到不放弃教程)1. 为什么用uv,而不是conda或者pip2. 安装uv(Windows)2.1 powershell下载2.2 winget下载2.3 直接下载安装包 3. uv教程3.1 创建虚拟环境 (uv venv) 4. uvx5. 此pip非…...
32单片机——GPIO的工作模式
1、GPIO GPIO(General Purpose Input Output,通用输入输出端口)是控制或者采集外部器件的信息的外设,即负责输入输出。它按组分配,每组16个IO口,组数视芯片而定。STM32F103ZET6芯片是144脚的芯片࿰…...
Science Robotics 新型层级化架构实现250个机器人智能组队,“单点故障”系统仍可稳定运行
近期,比利时布鲁塞尔自由大学博士生朱炜煦与所在团队提出了一种创新的机器人群体架构——“自组织神经系统”(SoNS,Self-organizing Nervous System)。 它通过模仿自然界中的生物神经系统的组织原理,为机器人群体建立了…...
【HFP】蓝牙HFP协议来电处理机制解析
目录 一、协议概述与技术背景 1.1 HFP协议演进 1.2 核心角色定义 1.3 关键技术指标 二、来电接入的核心交互流程 2.1 基础流程概述:AG 的 RING 通知机制 2.2 HF 的响应:本地提醒与信令交互 三、带内铃声(In-Band Ring Tone࿰…...
03-谷粒商城笔记
一个插件的install和生命周期的报错是不一样的 Maven找不到ojdbc6和sqljdbc4依赖包 这时候我找到了jar包,然后我就先找到一个jar安装到了本地仓库。 在终端上进行命令了: mvn install:install-file -DfileD:\ojdbc6-11.2.0.4.jar -DgroupIdcom.oracle …...
PHP 反序列化CLI 框架类PHPGGC 生成器TPYiiLaravel 等利用
# 反序列化链项目 -PHPGGC&NotSoSecure -NotSoSecure https://github.com/NotSoSecure/SerializedPayloadGenerator 为了利用反序列化漏洞,需要设置不同的工具,如 YSoSerial(Java) 、 YSoSerial.NET 、 PHPGGC 和它的先决条件。 Deserializati…...
LeetCode热题100——283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出:…...
C++入门小馆: 探寻vector类
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
力扣hot100_链表(3)_python版本
一、25. K 个一组翻转链表 1.1、206. 反转链表 py代码 class ListNode:def __init__(self, val0, next node):self.val valself.next next class Solution:def reverseList(self, head):pre Nonecur headwhile cur:next cur.nextcur.next prepre curcur nextreturn p…...
Lua 第9部分 闭包
在 Lua 语言中,函数是严格遵循词法定界的第一类值。 “第一类值”意味着 Lua 语言中的函数与其他常见类型的值(例如数值和字符串)具有同等权限: 一个程序可以将某个函数保存到变量中(全局变量和局部变量均可&a…...
【Linux】冯诺依曼体系结构及操作系统架构图的具体剖析
目录 一、冯诺依曼体系结构 1、结构图 2、结构图介绍: 3、冯诺依曼体系的数据流动介绍 4、为什么在该体系结构中要存在内存? 二、操作系统架构图介绍 1、操作系统架构图 2、解析操作系统架构图 3、为什么要有操作系统? 前些天发现了一…...
解析虚拟机与Docker容器化服务的本质差异及Docker核心价值
解析虚拟机与Docker容器化服务的本质差异及Docker核心价值 1.1 硬件虚拟化与操作系统级虚拟化 虚拟机(VM)基于硬件级虚拟化技术(Hypervisor),通过模拟完整硬件栈(CPU、内存、存储、网络)创建独…...
FreeRTOS深度解析:队列集(Queue Sets)的原理与应用
FreeRTOS深度解析:队列集(Queue Sets)的原理与应用 什么是队列集? 在FreeRTOS中,队列集(Queue Sets,英文名xQueueSet)是一种强大的数据结构,用于高效管理多个队列。它的…...
java将pdf转换成word
1、jar包准备 在项目中新增lib目录,并将如下两个文件放入lib目录下 aspose-words-15.8.0-jdk16.jar aspose-pdf-22.9.jar 2、pom.xml配置 <dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId><versi…...
网络原理 - 6
目录 4. 滑动窗口 滑动窗口出现丢包 情况一:数据报已经抵达,ACK 被丢了编辑 情况二:数据报直接就丢了 5. 流量控制 完! 4. 滑动窗口 这个滑动窗口是 TCP 中非常有特点的机制。 我们知道,TCP 是通过确认应答&…...
【Linux网络】构建类似XShell功能的TCP服务器
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
Spring AI - Redis缓存对话
先看效果 对话过程被缓存到了Redis 中。 原理 在上一节我们快速入门了SpringAI,具体文章请查看:快速入门Spring AI 创建 ChatClient 的代码如下: this.chatClient ChatClient.builder(chatModel).defaultSystem(DEFAULT_PROMPT).defaultAd…...
rk3588 驱动开发(二)第四章嵌入式 Linux LED 驱动开发实验
4.1 Linux 下 LED 灯驱动原理 Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。所以本章的 LED 灯驱动 最终也是对 RK3588 的 IO 口进行配置,与裸机实验不同的是,在 Linux 下编写驱动要符合 Linux 的驱动框架。开发板上的 LED 连接…...
第49讲:AI驱动的农业碳汇估算与生态价值评估 —— 打造更“绿”的智慧农业未来
目录 🌍 一、农业碳汇:我们为什么要关心它? 🤖 二、AI是如何介入农业碳汇评估的? 🛠 三、案例实战:AI估算区域农田碳汇储量 📍 场景设定: 📊 数据来源: 🔁 处理流程: 📈 四、生态价值评估:从碳储量到生态效益 🧭 五、平台与工具推荐 💬 六、…...
springmvc入门案例
目录 前言 springmvc概述 springmvc入门案例(使用配置类替代原本的web.xml) 第一步、创建一个web工程 第二步、引入相应的依赖(servlet-api、spring-webmvc、) 第三步、编写 SpringMVC配置类,并开启包扫描功能 第四步、编写…...
Node.js学习
概述 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,允许在服务器端运行 JavaScript 代码。它采用事件驱动和非阻塞 I/O 模型,适合构建高性能、可扩展的网络应用,尤其擅长处理实时应用和大规模数据密集型场景 背景 JavaScri…...
SQL注入漏洞中会使用到的函数
目录 一、信息获取函数 1. 通用函数 2. 元数据查询(INFORMATION_SCHEMA) 二、字符串操作函数 1. 字符串连接 2. 字符串截取 3. 编码/解码 三、报错注入专用函数 1. MySQL 2. SQL Server 3. PostgreSQL 四、时间盲注函数 1. 通用延迟 2. 计…...
MIT IDSS深度解析:跨学科融合与系统科学实践
麻省理工学院的IDSS(Institute for Data, Systems, and Society, IDSS)是一个致力于通过先进分析方法推动教育与研究的前沿机构。它将工程学、信息科学和数据科学的方法与社会科学的分析方法相结合,以应对复杂的社会挑战。 MIT IDSS 建立在统计学、计算机科学和特定应用领域…...
重塑智慧出行新生态,德赛西威全新战略愿景发布
4月22日,上海车展开幕前夕,德赛西威以“智新境,向远大”为主题,正式对外发布全新发展战略及使命、愿景;同时,代表未来AI出行趋势的智慧出行解决方案Smart Solution 3.0重磅亮相。 一、把握变革节点 创领产…...
全面解析 classification_report:评估分类模型性能的利器
解读 classification_report 的使用:评估分类模型性能的关键工具 在机器学习中,分类任务是最常见的应用场景之一。无论是垃圾邮件过滤、图像识别还是情感分析,分类模型的性能评估都是至关重要的一步。而 classification_report 是 Scikit-le…...
Qt案例 使用QFtpServerLib开源库实现Qt软件搭建FTP服务器,使用QFTP模块访问FTP服务器
本以为搭建和访问FTP服务器的功能已经是被淘汰的技术了,只会在学习新技术的时候才会了解学习学习,WinFrom版本,和windows Api版本访问FTP服务器的功能示例也都写过。没想到这次会在项目中再次遇到, 这里记录下使用Qt开源库QFtpSer…...
图像后处理记录
图像后处理记录 ocr后处理记录 opencv裁剪 编译命令 cmake -S . -B build-x64 -DBUILD_LIST"core,imgproc,imgcodecs,highgui" -DBUILD_SHARED_LIBSOFF -DBUILD_opencv_appsOFF -DBUILD_opencv_jsOFF -DBUILD_ANDROID_PROJECTSOFF -DBUILD_ANDROID_EXAMPLESOFF -…...
解决element中的el-anchor链接被作为路由跳转导致页面404
解决element中的el-anchor链接被作为路由跳转导致页面404 问题: 在使用elementPlus时,el-anchor-link中的href被识别为路由进行跳转,导致不能正常跳转到锚点,且页面显示404。 解决:自定义方法解决 <!--添加hand…...
Mapreduce中maven打包
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序(例如:jar包),并发运行在…...
C++初阶——string的使用(下)
C初阶——string的使用(下) 一、string类对象的容量操作 对于string的容量操作,我们可以通过顺序表来理解,顺序表是通过动态数组来实现的,在数据结构专栏的第一篇就是顺序表的详细讲解,链接如下ÿ…...
AIGC vs 人类创作者:是竞争还是协作?
AIGC vs 人类创作者:是竞争还是协作? 随着人工智能技术的飞速发展,特别是生成式AI(AIGC, AI-Generated Content)的崛起,越来越多的领域开始出现AI的身影。从文本创作、图像生成到音乐制作,AIGC…...
Stable Baselines3 结合 gym 训练 CartPole 倒立摆
视频讲解: Stable Baselines3 结合 gym 训练 CartPole 倒立摆 今天介绍下stable_baselines3和gym,可以方便实现DL的实现,应用在机械臂catch、reach等场景 测试代码仓库:https://github.com/LitchiCheng/DRL-learning.git https:…...