《Effective C#》系列之(四)——最小化内存泄露和资源占用
一、内存泄露
在《Effective C#》这本书中,最小化资源泄漏是其中一章的内容。以下是该章节的一些核心建议,以及使用C#代码示例说明:
及时释放非托管资源:在使用非托管资源时,需要手动释放这些资源,以避免资源泄漏。例如:
// 打开一个文件流并读取其中的数据
using (var stream = new FileStream("file.txt", FileMode.Open))
{
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
Console.WriteLine(Encoding.UTF8.GetString(data));
}
及时释放托管资源:在使用托管资源时,也需要手动释放这些资源,以避免资源泄漏。例如:
// 创建一个可释放的对象
public class DisposableObject : IDisposable
{
private bool _disposed = false; // 实现IDisposable接口
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
} protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// 释放托管资源
} // 释放非托管资源
_disposed = true;
}
} ~DisposableObject()
{
Dispose(false);
}
} // 使用可释放的对象
using (var obj = new DisposableObject())
{
// do something with obj
}
避免使用全局对象:全局对象容易造成资源泄漏,因此应该尽可能避免使用这种方式。例如:
// 不要使用全局对象
public static class GlobalObject
{
private static SomeResource _resource = null; public static SomeResource Resource
{
get
{
if (_resource == null)
{
_resource = new SomeResource();
}
return _resource;
}
}
} // 使用局部对象
public void DoSomething()
{
using (var resource = new SomeResource())
{
// do something with resource
}
}
注意事件和委托的订阅和取消订阅:在使用事件和委托时,需要注意及时取消订阅,以避免资源泄漏。例如:
// 订阅事件
_someObject.SomeEvent += OnSomeEvent; // 取消订阅事件
_someObject.SomeEvent -= OnSomeEvent;
避免循环引用:如果两个对象相互引用,可能会导致内存泄漏,因此需要注意避免这种情况。例如:
// 避免循环引用
public class A
{
private B _b; public A(B b)
{
_b = b;
}
} public class B
{
// ...
} var b = new B();
var a = new A(b);
b = null; // 可以释放B对象
a = null; // 也可以释放A对象
总之,以上这些建议都可以帮助程序员最小化资源泄漏,提高代码的可靠性和稳定性。
二、执行速度
使用合适的数据结构和算法,例如使用哈希表、二分查找等能够提高程序效率的算法。
避免使用过多的循环和递归,尽可能使用迭代代替递归。
避免使用过多的对象和动态分配的内存,尽可能使用值类型代替引用类型。
避免使用过多的异常处理,尽可能使用条件语句代替异常处理。
避免过度优化,应该优先考虑代码的可读性和可维护性。
使用多线程和并行计算技术,能够提高程序的并发能力和执行效率。
使用.NET Framework中提供的优化工具和性能分析工具,能够帮助发现程序中的性能瓶颈并进行优化。
三、内存占用
以下是一些可以减少C#程序内存占用的方法:
- 使用值类型而不是引用类型
值类型在栈上分配内存,而引用类型在堆上分配内存。因此,使用值类型可以减少堆内存的使用,从而减少程序的内存占用。
- 及时释放内存
在使用完对象后,及时将其置为null,以便垃圾回收机制可以回收内存。同时,在使用大量内存的情况下,可以通过手动调用垃圾回收机制来释放内存。
- 避免使用大量字符串
字符串是引用类型,会在堆上分配内存。因此,避免在程序中使用大量字符串,尤其是在循环中。
- 使用对象池
对象池是一种可以重复利用对象的机制。通过使用对象池,可以避免频繁地创建和销毁对象,从而减少内存占用。
- 避免使用大量的全局变量
全局变量会在程序启动时就被分配内存。因此,避免使用大量的全局变量,尤其是引用类型的全局变量。
- 避免使用大量的装箱和拆箱操作
装箱和拆箱操作会在堆上分配内存,因此避免在程序中频繁地进行这些操作。
- 使用内存映射文件
内存映射文件是一种可以将文件映射到内存中的机制。通过使用内存映射文件,可以避免将整个文件读取到内存中,从而减少内存占用。
四、IO频率
使用缓存:将需要频繁读写的数据缓存到内存中,减少对磁盘的访问次数。
批量读写:将多个读写操作合并成一个批量操作,减少单次读写操作的次数。
使用异步IO:使用异步IO操作可以在等待IO完成的同时执行其他操作,提高程序的并发性能。
使用内存映射文件:内存映射文件可以将文件映射到内存中,可以直接读写内存中的数据,减少对磁盘的访问次数。
数据压缩:对需要存储的数据进行压缩,减少磁盘占用和IO次数。
使用数据库:将数据存储在数据库中,使用索引等技术可以快速查询数据,减少对磁盘的访问次数。
缓存IO结果:对于需要频繁访问的IO结果,可以将结果缓存起来,减少对磁盘的访问次数。
《Effective C#》系列之(四)——最小化内存泄露和资源占用的更多相关文章
- C#内存泄露与资源释放 经验总结
本文链接:http://blog.csdn.net/yokeqi/article/details/41083939 C#相比其他语言,拥有强大的垃圾回收机制,但并不是这样,你就可以对内存管理放任不管, ...
- keras系列︱利用fit_generator最小化显存占用比率/数据Batch化
本文主要参考两篇文献: 1.<深度学习theano/tensorflow多显卡多人使用问题集> 2.基于双向LSTM和迁移学习的seq2seq核心实体识别 运行机器学习算法时,很多人一开始 ...
- ASP.NET Core :缓存系列(四):内存缓存 MemoryCache
System.Runtime.Caching/MemoryCache ICacheEntry 接口中的属性:具体设置过期时间 可以参考:微软文档ICacheEntry 接口 缓存基本使用 (一) 绝对 ...
- 013_针对单个pid的cpu/内存/io的资源占用统计
#!/usr/bin/env python import sys import os import subprocess from decimal import Decimal from decima ...
- winform,WPF 释放内存垃圾,减少资源占用方法
[System.Runtime.InteropServices.DllImport("kernel32.dll")] public static extern boo ...
- ThreadLocal深入理解与内存泄露分析
ThreadLocal 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本.所以每个线程都能够独立地改变自己的副本.而不会影响其他线程所相应的副本. ...
- Centos 6.4 x86_64 最小化安装后的优化——还需要整理
Centos 6.4 x86_64 最小化安装后的优化 购买了服务器以后要做的第一件事就是安装操作系统了,这里推荐安装 Centos 6.4 x86_64,安装系统时要选择最小化安装(不需要图 ...
- 将VMware虚拟机最小化到托盘栏
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可. 目录 前言 将VMware最小化到托盘栏的方法 1.下载 Trayconizer 2.解压 trayco ...
- 将VMware工作站最小化到托盘栏
目录 前言 将VMware最小化到托盘栏的方法 1.下载 Trayconizer 2.解压 trayconizerw.zip 3.创建 VMware 快捷方式 4.修改 VMware 快捷方式 5.运 ...
- [ZZ]最小化不可重现的bug
http://testerhome.com/topics/577 原文请见 Minimizing Unreproducible Bugs 不能重现的 bug 是我的灾难.我常常找到一个bug 后来又听 ...
随机推荐
- docsify + GitHub Page免费搭建个人博客
docsify生成文档 docsify是一个动态生成文档网站的工具.通过编辑MarkDown文件就能实现简约清爽的文档页面. 先在Github创建项目 创建项目成功后,把项目克隆到本地(以自己的实际地 ...
- 基于C语言的串口AT指令发送实例解析
一 知识点 1 AI指令后面一定要加 \n\r 2 注意AT指令里面待双引号的这种,要使用斜杠隔开. 二 源码: void Set_Pdu_Mode(void) { u8 a = 1; if(atKe ...
- Android webview只加载10%且出现白屏问题排查解决
原文:Android webview只加载10%且出现白屏问题排查解决 - Stars-One的杂货小窝 问题 有一个主页面,布局里是包含的一个自定义Webview,并且注入了些原生的方法进去,供原生 ...
- java list转set用法
参考:https://blog.csdn.net/kye055947/article/details/80561633 之前一直被这两list转set,set转list所烦恼,今天整理了下两者之间怎么 ...
- .NET Core使用 CancellationToken 取消API请求
您是否曾经访问过一个网站,它需要很长时间加载,最终你敲击 F5 重新加载页面. 即使用户刷新了浏览器取消了原始请求,而对于服务器来说,API也不会知道它正在计算的值将在结束时被丢弃,刷新五次,服务器将 ...
- FTP的配置和管理
实验环境: 两台windows servers 一台已经配置了FTP服务器,IP为192.168.1.220,vmnet1 一台作为客户端测试,IP为192.168.1.138,vmnet1 一:FT ...
- 三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析
三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析 在处理三维模型3DTile格式的轻量化压缩时,如何在减少数据量的同时,保证或提升数据质量是一大挑战.以下为一些提升数据质量的方法分析: 改 ...
- 摄影系列:李涛ps视频教程笔记
四种颜色模式: HSB:人眼的识别. RGB:基于光.(RGB自然三原色,三个最大值,得出白色,所以RGB为加色模式) CMY:基于印刷.(青.品.黄印刷三原色,三个最大值,得出黑色,所以CMY为减色 ...
- 【Oracle】Oracle表空间数据文件大小设置
Oracle数据文件默认大小上限是32G,如果要数据文件大于32G,需要在数据库创建之初就设置好. 表空间数据文件容量与DB_BLOCK_SIZE有关,在初始建库时,DB_BLOCK_SIZE要根据实 ...
- SpringCloud微服务集成Dubbo
1.Dubbo介绍 Apache Dubbo 是一款易用.高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现.流量治理.可观测.认证鉴权等能力.工具与最佳实践.用于解决微服务架构下 ...