C#内存泄漏的事例

Wesley13
• 阅读 856

C#内存泄漏的事例

一,使用非托管资源忘记及时Dispose

(1)  使用完非托管资源一定要Dispose或者使用using

using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
            {
                string str = "我好像不能全部覆盖源文件中的数据";
                byte[] buffer = Encoding.Default.GetBytes(str);
                fsWrite.Write(buffer,0,buffer.Length);//无返回值,以字节数组的形式写入数据
            }

       string path =@"C:\Users\fighting  man\Desktop\FileStream的使用\vs快捷键.txt" ;
            FileStream fsRead = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read);
            //三个参数(参数1读取文件的路径,参数2对文件的做什么样的操作,参数3对文件中的数据做什么样的操作)
            //FileStream 用来操作字节(不是一次性读取对内存压力小适合读大文件)
            try
            {
                //创建FileStream类的对象(路径,对文件的操作,对文本文件数据的操作)
                byte[] buffer = new byte[1024 * 1024 * 1];
                int r = fsRead.Read(buffer, 0, buffer.Length);//把数据读到字节数组中,返回实际读到的有效字节数
                string str = Encoding.Default.GetString(buffer, 0, r);//解码到实际读到的字节数
            }
            finally
            {
                fsRead.Close();//关闭流
                fsRead.Dispose();//释放流
            }

              非托管资源还包括OracleConnection,套接字,com对象,操作excel对象等,使用完毕一定要手动Dispose。

        (2)定义的自定义类里使用了非托管资源,需要继承接口IDisposable,实现Dispose方法,手动清理掉内部非托管资源。

public class DealData : IDisposable
    {
        private bool disposed = false;

        private System.Timers.Timer t = new System.Timers.Timer();

        private List<object> listAll;

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!disposed)
            {
                if (disposing)
                {
                    listAll.Clear();
                    //释放托管资源
                }
                t.Dispose();
                //释放非托管资源
                disposed = true;
            }
        }

        ~DealData() {
            MessageBox.Show("析构函数");
        }
    }

二,静态引起的内存泄漏现象

(1)静态对象导致的内存堆积,程序不执行完毕,内存就不能释放

public class MySingletonClass
{
    private static MySingletonClass myInstance;
    private static List<IAmBig> bigObjects = new List<IAmBig>();
    private MySingletonClass(){}
    public static MySingletonClass MyInstance
    {
        get
        {
            if(myInstance == null)
            {
                myInstance = new MySingletonClass();
            }
            return myInstance;
        }
    }
    public static IAmBig CreateBigObject()
    {
        var bigObject = new IAmBig();
        bigobject.AllocateMemory(4096);
        bigObjects.add(bigObject);
        return bigObject;
    }
}
public class IAmBig
{
    
}
点赞
收藏
评论区
推荐文章
深入了解 JavaScript 内存泄漏
在任何语言开发的过程中,对于内存的管理都非常重要,JavaScript也不例外。但是如果我们对内存泄漏没有什么概念,就有可能因为内存泄漏,导致许多问题。了解内存泄漏,如何避免内存泄漏,都是不可缺少的。
Wesley13 Wesley13
3年前
go中内存泄露的发现与排查
一,什么是内存泄漏Go中的并发性是以goroutine(独立活动)和channel(用于通信)的形式实现的。处理goroutine时,程序员需要小心翼翼地避免泄露。如果最终永远堵塞在I/O上(例如channel通信),或者陷入死循环,那么goroutine会发生泄露。即使是阻塞的goroutine,也会消耗资源
Wesley13 Wesley13
3年前
Java 内存泄漏
  Java的一个重要优点就是通过垃圾收集器(GarbageCollection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C不同。  随着越来越多的服
Stella981 Stella981
3年前
PHPExcel 内存泄漏
解决办法在PHPExcel\_Worksheet类中增加方法:代码如下复制代码publicfunctionDestroy(){foreach($this_cellCollectionas$index$dummy){$this_cellCollection$index
Wesley13 Wesley13
3年前
.NET中的GC垃圾回收
本章将和大家分享.NET中的GC垃圾回收。托管堆垃圾回收CLR提供GC。1、什么样的对象需要垃圾回收?  托管资源引用类型  托管资源和非托管资源:    托管的就是CLR控制的,例如:new的对象、string字符串、变量等;    非托管不是CLR能控制的,例如:数据库连接、文件流、句柄、打印机连接等;    u
Stella981 Stella981
3年前
JScript的内存泄漏
当一个系统没有妥善地管理它的内存分配时,就被称为内存泄漏,内存泄漏是一个bug,这问题会导致性能下降和运行错误。微软的InternetExplorer有许多的泄漏问题(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmsdn.microsoft.com%2Flibrary%2Fdef
Easter79 Easter79
3年前
ThreadLocal 内存泄露的实例分析
前言之前写了一篇深入分析ThreadLocal内存泄漏问题(https://my.oschina.net/thinwonton/blog/1505136)是从理论上分析ThreadLocal的内存泄漏问题,这一篇文章我们来分析一下实际的内存泄漏案例。分析问题的过程比结果更重要,理论结合实际才能彻底分析出内存泄漏的原因。案例与分析
Stella981 Stella981
3年前
JVM内存泄漏导致内存溢出(OOM)的场景
一、概念1\.内存泄漏:对象使用完之后,没有按照预期被GC回收,一直留在内存中2\.内存溢出:大量对象一直留在内存中,导致内存不够用(OOM),影响正常的程序运行二、内存泄漏的场景1\.内存中数据量太大,比如一次性从数据库中取出来太多数据2\.静态集合类中对对象的引用,在使用完后未清空(只把对象设为null,而不是从集合中移除),
Wesley13 Wesley13
3年前
Java内存泄漏解析!
前言:内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存。但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏。本章会说明什么是内存泄漏,为什么发生,以及如何防止它们。什么是内存泄漏?内存泄漏的定义:应用程序不再使用的对象,垃圾收集器却无法删除它们,因为它们正在被引用。为了理