C#规避内存泄漏的编码方法
C#规避内存泄漏的编码方法
内存泄漏是C#开发中常见的问题,尽管.NET有垃圾回收机制(GC),但不当的编码实践仍可能导致内存无法被及时回收。以下是系统性的规避内存泄漏的方法:
一、理解内存泄漏的常见原因
- 未释放的事件订阅
- 静态字段持有对象引用
- 未释放的非托管资源
- 缓存未设置过期策略
- 线程/任务未正确终止
- 闭包捕获外部变量
- WPF/WinForms控件未正确释放
二、核心规避技术
1. 事件管理
// 正确的事件订阅与取消订阅
public class Publisher
{public event EventHandler DataChanged;public void RaiseEvent(){DataChanged?.Invoke(this, EventArgs.Empty);}
}public class Subscriber : IDisposable
{private readonly Publisher _publisher;public Subscriber(Publisher publisher){_publisher = publisher;_publisher.DataChanged += OnDataChanged;}private void OnDataChanged(object sender, EventArgs e){// 处理事件}public void Dispose(){_publisher.DataChanged -= OnDataChanged;}
}
最佳实践:
- 使用
-=
明确取消订阅 - 实现
IDisposable
模式确保资源释放 - 在析构函数中作为最后手段取消订阅(不推荐依赖)
2. 静态字段管理
// 危险模式 - 静态集合持有对象
public static class Cache
{private static readonly List<object> _items = new List<object>();public static void Add(object item){_items.Add(item); // 对象永远不会被释放}
}// 改进方案 - 使用弱引用
public static class WeakCache
{private static readonly Dictionary<string, WeakReference<object>> _cache = new Dictionary<string, WeakReference<object>>();public static void Add(string key, object value){_cache[key] = new WeakReference<object>(value);}public static object Get(string key){if (_cache.TryGetValue(key, out var reference) && reference.TryGetTarget(out var value)){return value;}return null;}
}
3. 非托管资源处理
// 实现IDisposable模式
public class ResourceHolder : IDisposable
{private bool _disposed = false;private IntPtr _unmanagedResource;private SomeDisposableObject _managedResource;public ResourceHolder(){_unmanagedResource = AllocateUnmanagedResource();_managedResource = new SomeDisposableObject();}// 实现IDisposablepublic void Dispose(){Dispose(true);GC.SuppressFinalize(this); // 告诉GC不需要调用析构函数}protected virtual void Dispose(bool disposing){if (!_disposed){if (disposing){// 释放托管资源_managedResource?.Dispose();}// 释放非托管资源FreeUnmanagedResource(_unmanagedResource);_unmanagedResource = IntPtr.Zero;_disposed = true;}}~ResourceHolder(){Dispose(false); // 最后的保障}
}
使用模式:
// 使用using语句块
using (var resource = new ResourceHolder())
{// 使用资源
} // 自动调用Dispose()// 或者手动释放
var resource = new ResourceHolder();
try
{// 使用资源
}
finally
{resource.Dispose();
}
4. 缓存策略
// 使用MemoryCache替代静态集合
public class DataCache
{private readonly MemoryCache _cache = new MemoryCache(new MemoryCacheOptions());public void Add(string key, object value, TimeSpan expiration){_cache.Set(key, value, expiration);}public object Get(string key){return _cache.Get(key);}
}// 或者使用WeakReference实现简单缓存
public class WeakReferenceCache<TKey, TValue>
{private readonly Dictionary<TKey, WeakReference<TValue>> _cache = new Dictionary<TKey, WeakReference<TValue>>();public void Add(TKey key, TValue value){_cache[key] = new WeakReference<TValue>(value);}public bool TryGetValue(TKey key, out TValue value){if (_cache.TryGetValue(key, out var reference) && reference.TryGetTarget(out value)){return true;}value = default;return false;}
}
5. 集合管理
// 避免静态集合
public class LeakyCollection
{private static readonly List<object> _items = new List<object>(); // 内存泄漏public static void Add(object item){_items.Add(item);}
}// 改进方案 - 使用弱引用集合
public class SafeCollection
{private readonly ConditionalWeakTable<object, object> _items = new ConditionalWeakTable<object, object>();public void Add(object key, object value){_items.Add(key, value);}public object Get(object key){_items.TryGetValue(key, out var value);return value;}
}
6. WPF/WinForms特定优化
// WPF控件中的事件解绑
public class MyUserControl : UserControl
{public MyUserControl(){Loaded += OnLoaded;Unloaded += OnUnloaded;}private void OnLoaded(object sender, RoutedEventArgs e){// 订阅事件SomeService.DataChanged += OnDataChanged;}private void OnUnloaded(object sender, RoutedEventArgs e){// 取消订阅SomeService.DataChanged -= OnDataChanged;}private void OnDataChanged(object sender, EventArgs e){// 处理数据变化}
}// WinForms中的释放模式
public class MyForm : Form
{private bool _disposed = false;protected override void Dispose(bool disposing){if (!_disposed){if (disposing){// 释放托管资源someDisposableComponent?.Dispose();}// 释放非托管资源// ..._disposed = true;}base.Dispose(disposing);}
}
三、高级工具与技术
1. 内存分析工具
-
Visual Studio诊断工具:
- 内存使用情况分析
- 对象保留树分析
- 堆快照比较
-
dotMemory:
- 深入的内存分析
- 内存泄漏检测
- 对象生命周期跟踪
-
ANTS Memory Profiler:
- 实时内存监控
- 泄漏模式识别
- 生成详细报告
2. 代码分析工具
-
Roslyn分析器:
// 自定义Roslyn分析器示例(简化版) [DiagnosticAnalyzer(LanguageNames.CSharp)] public class EventSubscriptionAnalyzer : DiagnosticAnalyzer {public override void Initialize(AnalysisContext context){context.RegisterSyntaxNodeAction(AnalyzeEventSubscription, SyntaxKind.AddAssignmentExpression);}private void AnalyzeEventSubscription(SyntaxNodeAnalysisContext context){// 分析事件订阅是否有对应的取消订阅// 报告潜在的内存泄漏} }
-
静态代码分析:
- 使用SonarQube进行代码质量检查
- 配置规则检测未释放的资源
3. 运行时监控
// 自定义内存监控
public static class MemoryMonitor
{private static readonly Timer _timer = new Timer(OnTimerElapsed);static MemoryMonitor(){_timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(5));}private static void OnTimerElapsed(object state){var memory = GC.GetTotalMemory(false);Console.WriteLine($"当前内存使用: {memory / (1024 * 1024)} MB");// 可以添加阈值报警逻辑}
}
四、设计模式与最佳实践
1. 弱事件模式
// 弱事件实现
public class WeakEventManager<TEventArgs> where TEventArgs : EventArgs
{private class WeakEventListener{public WeakReference<EventHandler<TEventArgs>> HandlerReference { get; }public object Source { get; }public WeakEventListener(EventHandler<TEventArgs> handler, object source){HandlerReference = new WeakReference<EventHandler<TEventArgs>>(handler);Source = source;}public bool IsAlive => HandlerReference.TryGetTarget(out _);}private readonly List<WeakEventListener> _listeners = new List<WeakEventListener>();public void AddHandler(EventHandler<TEventArgs> handler, object source){_listeners.Add(new WeakEventListener(handler, source));}public void RemoveHandler(EventHandler<TEventArgs> handler, object source){_listeners.RemoveAll(l => l.HandlerReference.TryGetTarget(out var target) && target == handler && EqualityComparer<object>.Default.Equals(l.Source, source));}public void Raise(object sender, TEventArgs e){foreach (var listener in _listeners.ToArray()) // 复制列表避免并发修改{if (listener.IsAlive && listener.HandlerReference.TryGetTarget(out var handler) &&(listener.Source == null || listener.Source == sender)){handler(sender, e);}else{_listeners.Remove(listener); // 清理失效的监听器}}}
}
2. 工厂模式与对象池
// 对象池实现
public class ObjectPool<T> where T : new()
{private readonly ConcurrentBag<T> _objects = new ConcurrentBag<T>();private readonly int _maxSize;public ObjectPool(int maxSize = 100){_maxSize = maxSize;}public T Get(){if (_objects.TryTake(out var item)){return item;}return new T();}public void Return(T item){if (_objects.Count < _maxSize){_objects.Add(item);}// 否则丢弃对象,由GC处理}
}// 使用示例
var pool = new ObjectPool<ExpensiveObject>();
var obj = pool.Get();
try
{// 使用对象
}
finally
{pool.Return(obj);
}
五、常见内存泄漏场景及解决方案
1. 事件未释放
问题代码:
public class LeakyClass
{public event EventHandler Changed;public void DoSomething(){var handler = new EventHandler(OnChanged);Changed += handler; // 未释放}private void OnChanged(object sender, EventArgs e){// 处理事件}
}
解决方案:
public class FixedClass : IDisposable
{private bool _disposed;private event EventHandler _changed;public event EventHandler Changed{add { _changed += value; }remove { _changed -= value; }}public void DoSomething(){var handler = new EventHandler(OnChanged);Changed += handler;try{// 使用事件}finally{Changed -= handler;}}public void Dispose(){if (!_disposed){_changed = null;_disposed = true;}}
}
2. 静态集合持有对象
问题代码:
public static class LeakyCache
{private static readonly List<object> _items = new List<object>();public static void Add(object item){_items.Add(item); // 对象永远不会被释放}
}
解决方案:
public class FixedCache
{private readonly Dictionary<string, WeakReference<object>> _cache = new Dictionary<string, WeakReference<object>>();public void Add(string key, object value){_cache[key] = new WeakReference<object>(value);}public object Get(string key){if (_cache.TryGetValue(key, out var reference) && reference.TryGetTarget(out var value)){return value;}return null;}
}
3. WPF控件未正确释放
问题代码:
public class LeakyUserControl : UserControl
{public LeakyUserControl(){Loaded += OnLoaded;}private void OnLoaded(object sender, RoutedEventArgs e){SomeService.DataChanged += OnDataChanged; // 未取消订阅}private void OnDataChanged(object sender, EventArgs e){// 处理数据变化}
}
解决方案:
public class FixedUserControl : UserControl, IDisposable
{private bool _disposed;public FixedUserControl(){Loaded += OnLoaded;Unloaded += OnUnloaded;}private void OnLoaded(object sender, RoutedEventArgs e){SomeService.DataChanged += OnDataChanged;}private void OnUnloaded(object sender, RoutedEventArgs e){SomeService.DataChanged -= OnDataChanged;}private void OnDataChanged(object sender, EventArgs e){// 处理数据变化}public void Dispose(){if (!_disposed){Unloaded -= OnUnloaded;SomeService.DataChanged -= OnDataChanged;_disposed = true;}}
}
六、性能监控与诊断
1. 内存快照分析
-
使用Visual Studio诊断工具:
- 运行应用程序
- 打开"诊断工具"窗口(调试 > 窗口 > 显示诊断工具)
- 拍摄内存快照
- 分析对象保留树
-
dotMemory分析步骤:
# 启动应用程序并附加dotMemory dotMemory.exe start MyWpfApp.exe --trigger-start=AppDomain
- 分析内存分配
- 查找未被释放的对象
- 识别泄漏源
2. 实时监控
// 自定义内存监控
public static class MemoryMonitor
{private static readonly Timer _timer = new Timer(OnTimerElapsed);static MemoryMonitor(){_timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(5));}private static void OnTimerElapsed(object state){var memory = GC.GetTotalMemory(false);Console.WriteLine($"当前内存使用: {memory / (1024 * 1024):N0} MB");// 可以添加阈值报警if (memory > 100 * 1024 * 1024) // 100MB{Console.WriteLine("警告: 内存使用过高!");}}
}
七、高级技巧
1. 使用WeakReference优化缓存
public class WeakCache<TKey, TValue>
{private readonly Dictionary<TKey, WeakReference<TValue>> _cache = new Dictionary<TKey, WeakReference<TValue>>();public void Add(TKey key, TValue value){_cache[key] = new WeakReference<TValue>(value);}public bool TryGetValue(TKey key, out TValue value){if (_cache.TryGetValue(key, out var reference) && reference.TryGetTarget(out value)){return true;}value = default;return false;}public void Cleanup(){var deadKeys = _cache.Where(kvp => !kvp.Value.TryGetTarget(out _)).Select(kvp => kvp.Key).ToList();foreach (var key in deadKeys){_cache.Remove(key);}}
}
2. 使用Lazy和工厂模式延迟初始化
public class ResourceFactory
{private static readonly Lazy<Resource> _instance = new Lazy<Resource>(() => new Resource(), LazyThreadSafetyMode.ExecutionAndPublication);public static Resource Instance => _instance.Value;
}// 使用
var resource = ResourceFactory.Instance; // 只有第一次访问时才创建
3. 使用IDisposable模式管理资源
public class DatabaseConnection : IDisposable
{private IDbConnection _connection;private bool _disposed;public DatabaseConnection(string connectionString){_connection = CreateConnection(connectionString);}public void ExecuteQuery(string query){if (_disposed) throw new ObjectDisposedException(nameof(DatabaseConnection));using (var command = _connection.CreateCommand()){command.CommandText = query;// 执行查询}}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (!_disposed){if (disposing){_connection?.Dispose();_connection = null;}_disposed = true;}}~DatabaseConnection(){Dispose(false);}
}
八、总结
规避C#内存泄漏需要系统性的方法:
- 理解内存管理机制:掌握GC工作原理和托管/非托管资源区别
- 遵循最佳实践:正确实现IDisposable模式,合理使用事件
- 使用专业工具:Visual Studio诊断工具、dotMemory等
- 编写可测试代码:设计易于检测内存泄漏的架构
- 持续监控:在生产环境中设置内存监控
通过结合编码规范、设计模式和工具支持,可以显著降低内存泄漏的风险,构建健壮高效的.NET应用程序。
相关文章:
C#规避内存泄漏的编码方法
C#规避内存泄漏的编码方法 内存泄漏是C#开发中常见的问题,尽管.NET有垃圾回收机制(GC),但不当的编码实践仍可能导致内存无法被及时回收。以下是系统性的规避内存泄漏的方法: 一、理解内存泄漏的常见原因 未释放的事件订阅静态…...
ARM 指令集(ubuntu环境学习) 第一章:ARM 指令集概述
1.1 ARM 架构简介 ARM(Advanced RISC Machine)是一种精简指令集计算机(RISC)架构,最初由英国的 ARM Holdings 公司设计。与复杂指令集计算机(CISC)不同,RISC 架构通过使用简单且高效的指令集,使得处理器能够以更高的速度和更低的功耗执行任务。ARM 架构被广泛应用于各…...
OpenCV实战教程:从零开始的计算机视觉之旅
第一部分:基础入门 OpenCV简介 什么是OpenCV及其应用领域开发环境搭建(Windows/MacOS/Linux)安装配置和第一个程序"Hello OpenCV" 图像基础 图像的数字表示方式色彩空间(RGB、HSV、灰度图)图像读取、显示与…...
零基础做自动驾驶集成测试(仿真)
图 1:使用 GPUDrive 进行极快的多代理模拟。上图:GPUDrive 中 Waymo Open Motion Dataset 场景的鸟瞰图,方框表示受控智能体,圆圈表示其目标。底部:相应的代理视图,以一个代理为中心。可以根据用户的目标轻…...
阿里云dns服务器不可用怎么办?dns可以随便改吗?
阿里云DNS服务器不可用怎么办?dns可以随便改吗? 当DNS服务器不可用时,可能导致无法访问网站或网络服务。以下是常见的解决方法: 1. 检查网络连接 确保设备已连接到互联网(如Wi-Fi或有线网络)。 尝试访问其他网站或服务&#x…...
神经网络用于地震数据时空均匀插值的方法与开源资料
神经网络用于地震数据时空均匀插值的方法与开源资料 地震数据的不均匀采样是一个常见问题,神经网络提供了一种有效的解决方案。以下是关于如何使用神经网络进行地震数据时空均匀插值的概述和可用资源。 主要方法 1. 基于深度学习的插值方法 卷积神经网络(CNN)&a…...
线性微分方程与非线性微分方程
方程一 d x d t x \frac{dx}{dt} x dtdxx 这是一个一阶线性常微分方程,可以直接分离变量求解。 将变量分离: d x x d t \frac{dx}{x} dt xdxdt 两边积分: ∫ 1 x d x ∫ 1 d t ⇒ ln ∣ x ∣ t C \int \frac{1}{x} \, dx \…...
Windows查看和修改IP,IP互相ping通
Windows系统 查看IP地址 winr 输入cmd 打开终端使用 ipconfig 或 ipconfig -all 命令查看当前网络 IPV4地址 Windows系统 修改IP地址 自动获取IP(DHCP): 打开 控制面板,点击 网络和Internet。点击 网络和共享中心。选择 更改适配…...
ESP32开发之freeRTOS的信号量
什么是信号量信号量能干啥信号量的函数实例举例总结什么是信号量 简而言之,就是发出通知,接收通知的任务获得通知后去干啥啥。通知有多有少。自定义通知数量的,叫计数型信号量;只有有无(即“0”,“1”)通知的,叫二进制信号量。 信号量能干啥 资源管理:控制多个任务对…...
CRMEB-PRO系统定时任务扩展开发指南
适用场景 当系统内置定时任务类型无法满足业务需求时,开发者可通过本教程快速掌握自定义定时任务的扩展方法。本指南以"定时检测服务"为例,演示完整开发流程。 我想添加一个定时任务 ,而这里没有我需要的,我怎么来添加 比如我想添加一个定时检…...
单片机不同通信方式的适用场景
一、串口通信 UART 通信双方约定好波特率,每次发送一个字节(8位数据) 这种通信方式一共有2根线,且互相独立不受影响。 串口通信的缺点 二、RS232和RS485 优点是能够远距离传输信号 RS232达到30m RS485达到1000m 同时RS485还具有一对多的功能 三、S…...
【神经网络与深度学习】探索全连接网络如何学习数据的复杂模式,提取高层次特征
引言 全连接网络(Fully Connected Network,FCN)是深度学习中的重要架构,广泛用于模式识别、分类和回归任务。其强大的特征提取能力使其能够自动学习输入数据中的复杂模式,并逐步形成高层次特征。这种能力主要依赖于参…...
股指期货贴水对对冲的影响大吗?
如果你持有股票,又担心股市下跌,可能会想到用股指期货来“对冲风险”——比如买入股票的同时,卖出股指期货合约。但如果股指期货处于贴水状态(期货价格低于现货价格),对冲效果会受影响吗? 一、…...
浙江大学 | DeepSeek系列公开课 | 当艺术遇见AI:科艺融合的前沿探索
今天要给大家分享一份由浙江大学出品的DeepSeek系列公开课第三季第一期,公开课的主题是当艺术遇见AI,科艺融合的新探索。本报告系统展示了浙江大学在艺术与人工智能融合领域的研究成果,涵盖古画修复流程、色彩复原技术、诗画融合模型、图像召…...
(Go Gin)Gin学习笔记(三)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
1. 数据解析和绑定 bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将请求体中的参数值绑定到对应的结构体上,以方便后续业务逻辑的处理 1.1 JSON数据解析和绑定 客户端传参,后端接收并解析到结构体 package mainim…...
【JavaEE】网络原理之初识(1.0)
目录 编辑 局域网与广域网 IP地址和端口号 实现简单的服务器客户端交互 简单理解socket TCP和UDP的差别(初识) socket面对udp DatagramSocket API DatagramSocket 构造方法 DatagramSocket 方法: DatagramPacket API Data…...
Go与Cpp的本质区别
这个问题是我们经常听到的问题 常见的观点有 Go 与 C 的差异主要体现在设计哲学、内存管理、并发模型、语法特性及应用场景等方面,以下从多个维度进行详细对比: 一、内存管理机制 C:需手动管理内存(如 new/delete、智能…...
Vulkan 学习(16)---- 使用 VertexBuffer
Vertex Buffer 创建一个 VertexBuffer 存储 Vertex data,代替之前在 Shader 中使用固定顶点值的做法 Vertex Shader 修改 GLSL 的 VertexShader 如下: 注意这里指定了 input Vertex data 的 location 和 格式 #version 450 layout(location 0) in vec2 inPosit…...
论文阅读 2024 arxiv Comprehensive Assessment of Jailbreak Attacks Against LLMs
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Comprehensive Assessment of Jailbreak Attacks Against LLMs https://arxiv.org/pdf/2402.05668 https://www.doubao.com/chat/4015423571416834 速览 这篇论文是关于大…...
SIFT特征点检测
刚看完了SIFT特征点检测的原理,阅读的是两篇csdn博客,一个全面和一个最全面,不得不说,你俩写的都很全面,这么用心奉献知识的博主是全人类的财富。 现在用我这张笨拙的嘴先说一下我理解的流程 首先先将图像扩大一倍&a…...
开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验-pipeline方式(二)
一、前言 阿里云最新推出的 Qwen3-8B 大语言模型,作为国内首个集成“快思考”与“慢思考”能力的混合推理模型,凭借其 80 亿参数规模及 128K 超长上下文支持,正在重塑 AI 应用边界。该模型既可通过轻量化“快思考”实现低算力秒级响应,也能在复杂任务中激活深度推理模式,以…...
Python os.path.join()路径拼接异常
问题 在使用os.path.join()对两个路径进行拼接,如:/University/School/和/Department/Class/进行拼接,最终的结果为/Department/Class/,而/University/School/却不知所踪。 import osos.path.join(“/University/School/”, “/…...
Flink之DataStream
Apache Flink 的 DataStream API 是用于 处理无限(流)或有限(批)数据流的核心编程模型,适用于事件驱动、实时分析、ETL 等场景。相比 Flink Table API,DataStream API 提供了更强的灵活性和底层控制能力。 …...
WHAT - Tailwind CSS + Antd = MetisUI组件库
文章目录 Tailwind 和 Antd 组件库MetisUI 组件库 Tailwind 和 Antd 组件库 在 WHAT - Tailwind 样式方案(不写任何自定义样式) 中我们介绍了 Tailwind,至于 Antd 组件库,我们应该都耳熟能详,官网地址:htt…...
【LLM】MOE混合专家大模型综述(重要模块原理)
note 当前的 MoE 架构就是一个用显存换训练时长/推理延迟的架构MoE 目前的架构基本集中在于将原先 GPT 每层的 FFN 复制多份作为 n 个 expert,并增加一个 router,用来计算每个 token 对应到哪个 FFN(一般采用每个 token 固定指派 n 个 exper…...
量子机器学习中的GPU加速实践:基于CUDA Quantum的混合编程模型探索
引言:量子机器学习的新范式 在量子计算与经典机器学习交叉融合的前沿领域,量子机器学习(Quantum Machine Learning, QML)正经历着革命性突破。然而,随着量子比特规模的增长和算法复杂度的提升,传统计算架构…...
CentOS Linux 环境二进制方式安装 MySQL 5.7.32
文章目录 安装依赖包新建用户解压初始化配置文件启动服务登录MySQL修改密码停止数据库 安装依赖包 yum -y install libaio perl perl-devel libncurses* autoconf numactl新建用户 useradd mysql解压 tar xf mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.32-l…...
数学:拉马努金如何想出计算圆周率的公式?
拉马努金(Srinivasa Ramanujan)提出的圆周率(π)计算公式,源于他对数学模式的超凡直觉、对无穷级数和模形式的深刻洞察,以及独特的非传统数学思维方式。尽管他的思考过程带有强烈的个人色彩,甚至…...
Java 未来技术栈:从云原生到 AI 融合的企业级技术演进路线
一、云原生架构:重构 Java 应用的运行范式 1.1 微服务架构的深度进化 Java 在微服务领域的实践正从 Spring Cloud 向服务网格(Service Mesh)演进。以 Istio 为代表的服务网格技术,通过 Sidecar 模式实现服务间通信的透明化管理&…...
mid360驱动安装以及联合相机标定
1 mid360 安装 1.1 安装 一定要使用 SDK2和 ROS2驱动(livox_ros_driver2) 先安装SDK2,再安装livox_ros_driver2 GitHub - Livox-SDK/Livox-SDK2: Drivers for receiving LiDAR data and controlling lidar, support Lidar HAP and Mid-360. GitHub - Livox-SDK/l…...
LeetCode —— 572. 另一棵树的子树
572. 另一棵树的子树 题目:给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所…...
模型部署技巧(一)
模型部署技巧(一) 以下内容是参考CUDA与TensorRT模型部署内容第六章,主要针对图像的前/后处理中的trick。 参考: 1.部署分类器-int8-calibration 2. cudnn安装地址 3. 如何查找Tensor版本,与cuda 和 cudnn匹配 4. ti…...
PostgreSQL中的SSL
PGSQL数据库的默认隔离级别是读提交,并且同时支持可重复读和序列化模式。但是在9.1之前的版本中,序列化模式等价于快照隔离,并非是真正的序列化模式。 这样的话就会存在一个问题,那就是写偏序(Write Skew)…...
使用 Spring Data Redis 实现 Redis 数据存储详解
使用 Spring Data Redis 实现 Redis 数据存储详解 Spring Data Redis 是 Spring 生态中操作 Redis 的核心模块,它封装了 Redis 客户端的底层细节(如 Jedis 或 Lettuce),提供了统一的 API 来操作 Redis 的数据结构。以下是详细实现…...
短视频矩阵系统贴牌开发实战:批量剪辑文件夹功能设计与实现
摘要:在短视频矩阵系统的开发中,批量处理功能是提升运营效率的关键。本文将深入探讨如何实现基于文件夹的短视频批量剪辑功能,涵盖技术选型、核心功能实现及代码示例。 一、需求背景与场景价值 在短视频矩阵运营场景中,运营者常面…...
2025年消防设施操作员考试题库及答案
一、判断题 25.防火门顺序器使用半个月后,需检查所有的螺钉,对固定螺钉进行加固拧紧,后续每月进行一次。() 答案:错误 解析:本题考查的是防火门顺序器的保养。防火门顺序器使用一周后&#x…...
ASP.NET MVC后端控制器用模型 接收前端ajax数据为空
1、前端js代码 如下: const formData {DeptName: D001,Phone: 12345678900 };$.ajax({url: "/Phone/SavePhone1",type: "POST",contentType: "application/json",data: JSON.stringify(formData), //必须要JSON.stringifysuccess:…...
ES基本使用方式
ES基本使用 文章目录 ES基本使用1.es的访问使用URL访问 2.mapping的理解Dynamic Mappingkeyword 与 text的区别基础定义与核心差异主字段,子字段 创建mapping 3.创建索引4.查看索引列表5.删除索引6.添加数据7.查询数据 重置es密码,初始用户elastic el…...
【中间件】bthread效率为什么高?
bthread效率为什么更高? 1 基本概念 bthread是brpc中的用户态线程,也是协程的一种实现。其采用M:N模型,即多个用户线程映射到少量的系统线程上。 2 高效做法 用户态调度:避免内核态和用户态之间的切换开销,上下文切…...
Transformer架构指南:从原理到实战资源全更新
🌟 什么是Transformer? 2017年Google提出的Transformer架构,彻底颠覆了传统RNN/LSTM的序列建模方式,通过自注意力机制实现全局上下文建模,成为GPT、BERT等大模型的底层基石。其核心优势在于并行化计算和长距离依赖捕捉…...
数据库规范
数据库版本相关 版本:mysql8.0 引擎:InnoDB 字符集:utf8mb4_general_ci 表名称 字段名称te 不允许使用大写字母,尽量使用英文或英文缩写,中间用下划线连接 数据表前缀为zzt_ 同一功能模块的表(特别是附表)尽量保持…...
Java 核心--泛型枚举
作者:IvanCodes 发布时间:2025年4月30日🤓 专栏:Java教程 各位 CSDN伙伴们,大家好!👋 写了那么多代码,有没有遇到过这样的“惊喜”:满心欢喜地从 ArrayList 里取出数据…...
使用skywalking进行go的接口监控和报警
安装 helm upgrade --install skywalking ./skywalking-v1 --namespace skywalking --create-namespace 查看安装结果 kubectl get pod -n skywalking NAME READY STATUS RESTARTS AGE elasticsearch-6c4ccbf99f-ng6sk 1/1 …...
基于Docker的Elasticsearch ARM64架构镜像构建实践
一、前言 Elasticsearch(以下简称为ES) 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次…...
【Token系列】14|Prompt不是文本,是token结构工程
文章目录 14|Prompt不是文本,是token结构工程一、很多人写的是“自然语言”,模型读的是“token序列”二、Prompt写法会直接影响token结构密度三、token分布影响Attention矩阵的聚焦方式四、token数 ≠ 有效信息量五、Prompt结构设计建议&…...
在宝塔面板中安装OpenJDK-17的三种方法
title: 在宝塔面板中安装OpenJDK-17的三种方法 date: 2025-4-30 categories: 技术教程 tags: [Minecraft, 服务器搭建, 宝塔面板, Java] 如果你的宝塔面板软件商店中缺少 OpenJDK-17(例如搭建 Minecraft 1.17 服务器时),本文提供三种解决方…...
瑞昱点屏芯片RTD2785T带旋转功能
一、产品概述 RTD2785T是瑞昱半导体(Realtek)推出的新一代高性能显示驱动芯片,专为高端显示器、嵌入式系统、工业控制及专业影像设备设计。该芯片集成多接口输入(HDMI、DP、DVI、VGA)与多种输出接口(eDP、…...
蓝桥杯Python(B)省赛回忆
Q:为什么我要写这篇博客? A:在蓝桥杯软件类竞赛(Python B组)的备赛过程中我在网上搜索关于蓝桥杯的资料,感谢你们提供的参赛经历,对我的备赛起到了整体调整的帮助,让我知道如何以更…...
自主采集高质量三维重建数据集指南:面向3DGS与NeRF的图像与视频拍摄技巧【2025最新版!!】
一、✨ 引言 随着三维重建技术的飞速发展,NeRF(Neural Radiance Fields)与 3D Gaussian Splatting(3DGS)等方法成为重建真实场景和物体几何细节的前沿方案。这些方法在大规模场景建模、机器人感知、文物数字化、工业检…...
为Mac用户定制的云服务器Vultr 保姆级教程
以下是专为 Mac 用户 定制的 Vultr 保姆级教程,涵盖从注册、部署服务器到常见问题解决的全流程指南,配合实际案例和故障排查,确保流畅使用。 一、Vultr 基础介绍 1.Vultr 是什么? Vultr 是一家美国云计算服务商,提供…...